在与Rails应用程序相同的域上运行Wordpress的最佳方法是什么?
我有一个标准的Rails应用程序,Nginx和Mongrel在 http://mydomain 上运行。我需要在 http://mydomain.com/blog 运行一个Wordpress博客。我倾向于在Apache中托管博客,该博客运行在同一台服务器或单独的框中,但我不希望用户在URL中看到不同的服务器。这是否可能,如果没有,你会建议什么来实现目标?
我有一个标准的Rails应用程序,Nginx和Mongrel在 http://mydomain 上运行。我需要在 http://mydomain.com/blog 运行一个Wordpress博客。我倾向于在Apache中托管博客,该博客运行在同一台服务器或单独的框中,但我不希望用户在URL中看到不同的服务器。这是否可能,如果没有,你会建议什么来实现目标?
实际上,由于你正在使用Nginx,你已经处于良好的状态,不需要Apache。
您可以通过fastcgi运行PHP(在Nginx wiki中有如何执行此操作的示例),并在Nginx配置中使用URL匹配模式将一些URL定向到Rails,将其他URL定向到PHP。
这里有一个通过PHP fastcgi运行WordPress博客的示例Nginx配置(注意我还放入了Nginx相当于WordPress .htaccess,所以你也将有花哨的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生成器(Lighttpd是一个非常快速的编译,没有奇怪的依赖关系,所以安装起来快速而简单),但你也可以使用一个简短的shell / Perl脚本。
我认为joelhardi的解决方案优于以下几点。但是,在我自己的应用程序中,我喜欢将博客保存在与Rails站点不同的VPS上(内存分离问题)。若要使用户看到相同的 URL,请使用通常用于代理 mongrel 群集的相同代理技巧,但代理到另一个框上的端口 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应用程序。