我有一个标准的 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 环境中。

它可能很容易适应您的情况。这非常方便。

在我看来,像重写操纵器这样的东西会做你想做的事。抱歉,我没有更多细节——只是大声思考:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top