在与 Rails 应用程序相同的域中运行 Wordpress 的最佳方法是什么?
-
01-07-2019 - |
题
我有一个标准的 Rails 应用程序,Nginx 和 Mongrel 运行在 http://我的域名. 。我需要运行一个 WordPress 博客 http://mydomain.com/blog. 。我的偏好是在同一服务器或单独的服务器上运行的 Apache 中托管博客,但我不希望用户在 URL 中看到不同的服务器。这可能吗?如果不可能,您会建议采取什么措施来实现这一目标?
解决方案
我认为 joelhardi 的解决方案优于以下解决方案。然而,在我自己的应用程序中,我喜欢将博客保留在独立的 VPS 上而不是 Rails 站点上(内存问题的分离)。为了让用户看到相同的 URL,您可以使用通常用于代理混合集群的相同代理技巧,只不过您代理到另一个机器上的端口 80(或其他端口)。十分简单。对于用户来说,它就像代理到 mongrel 一样透明——他们只能“看到”NGINX 在您域的端口 80 上做出响应。
upstream myBlogVPS {
server 127.0.0.2:80; #fix me to point to your blog VPS
}
server {
listen 80;
#You'll have plenty of things for Rails compatibility here
#Make sure you don't accidentally step on this with the Rails config!
location /blog {
proxy_pass http://myBlogVPS;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
顺便说一句,您可以使用这个技巧让 Rails 与您想要的任何服务器技术一起使用。直接代理到适当的服务器/端口,NGINX 将对外界隐藏它。此外,由于 URL 都引用同一个域,因此只要正确编写 URL,您就可以无缝集成基于 PHP 的博客、基于 Python 的跟踪系统和 Rails 应用程序。
其他提示
实际上,由于您使用的是 Nginx,所以您已经处于良好状态并且不需要 Apache。
您可以通过 fastcgi 运行 PHP(有如何执行此操作的示例 在 Nginx 维基百科中),并在 Nginx 配置中使用 URL 匹配模式将某些 URL 定向到 Rails,将其他 URL 定向到 PHP。
下面是一个通过 PHP fastcgi 运行 WordPress 博客的 Nginx 配置示例(请注意,我还放入了与 WordPress .htaccess 等效的 Nginx,因此您还将拥有已经使用此配置的精美 URL):
server {
listen example.com:80;
server_name example.com;
charset utf-8;
error_log /www/example.com/log/error.log;
access_log /www/example.com/log/access.log main;
root /www/example.com/htdocs;
include /www/etc/nginx/fastcgi.conf;
fastcgi_index index.php;
# Send *.php to PHP FastCGI on :9001
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001;
}
# You could put another "location" section here to match some URLs and send
# them to Rails. Or do it the opposite way and have "/blog/*" go to PHP
# first and then everything else go to Rails. Whatever regexes you feel like
# putting into "location" sections!
location / {
index index.html index.php;
# URLs that don't exist go to WordPress /index.php PHP FastCGI
if (!-e $request_filename) {
rewrite ^.* /index.php break;
fastcgi_pass 127.0.0.1:9001;
}
}
}
这是我在上面的配置中包含的 fastcgi.conf 文件(我将其放在一个单独的文件中,以便我的所有虚拟主机配置文件都可以将其包含在正确的位置,但您不必这样做):
# joelhardi fastcgi.conf, see http://wiki.codemongers.com/NginxFcgiExample for source
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param REDIRECT_STATUS 200;
我也碰巧按照 Nginx wiki 的建议进行操作,并使用 Lighttpd 中的 spawn-fcgi 作为我的 CGI-spawner(Lighttpd 的编译速度非常快,没有奇怪的依赖项,因此安装起来既快速又简单),但你也可以为此使用一个简短的 shell/Perl 脚本。
上面的答案很好地解决了您的问题。
另一种 FCGI 是使用 php-fpm。文档有点稀疏,但效果很好。
现在的 Nginx 提供了执行此操作的脚本 如果您处于 EC2 / AWS 环境中。
它可能很容易适应您的情况。这非常方便。
在我看来,像重写操纵器这样的东西会做你想做的事。抱歉,我没有更多细节——只是大声思考:)