在与 Rails 应用程序相同的域上运行 Wordpress 的最佳方式是啥?

Posted

技术标签:

【中文标题】在与 Rails 应用程序相同的域上运行 Wordpress 的最佳方式是啥?【英文标题】:What's the best way to run Wordpress on the same domain as a Rails application?在与 Rails 应用程序相同的域上运行 Wordpress 的最佳方式是什么? 【发布时间】:2010-09-10 12:14:38 【问题描述】:

我有一个标准的 Rails 应用程序,在 http://mydomain 上运行 nginx 和 Mongrel。我需要在http://mydomain.com/blog 运行一个 Wordpress 博客。我的偏好是将博客托管在 Apache 中,在同一台服务器或单独的机器上运行,但我不希望用户在 URL 中看到不同的服务器。这可能吗?如果不可能,您会建议什么来实现目标?

【问题讨论】:

【参考方案1】:

Nginx 现在provides a script for doing this 如果您在 EC2 / AWS 环境中。

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

【讨论】:

【参考方案2】:

上面的答案很好地解决了你的问题。

另一种 FCGI 是使用 php-fpm。文档有点稀疏,但效果很好。

【讨论】:

【参考方案3】:

我认为 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 都指向同一个域,因此您可以无缝集成基于 PHP 的博客、基于 Python 的跟踪系统和 Rails 应用程序——只要您正确编写 URL。

【讨论】:

同意,将 fastcgi 解决方案保存在同一台服务器上时效果很好,尽管我不得不重新安装/更新 NGINX 和 php,因为最初没有包含 fastcgi。对于单独的服务器,此解决方案似乎运行良好 - 如果有人知道任何陷阱,请添加它们。 代理对您来说可以正常工作,但它会带来一系列问题。其中之一是性能有点差。另一个是您必须更改后端服务器上的代码以使其知道它在代理后面运行,并且必须查看诸如 X-Forwarded-For 之类的东西(这实际上是一个 ... ... IP 数组,不一定是单个地址 b/c 许多用户在公司或 ISP 代理服务器后面运行,如果您的应用程序使用它,您希望提取用户的实际 IP .此外,X-Forwarded-For 是用户设置的值,因此不“受信任”——有关更多信息,请参阅 Apache mod_extract_forwarded ... ...那里有信息。 (代理很好学,有一天你可能会使用 Varnish 或 Squid!)除了 HTTP 代理之外的另一种选择是让 FCGI 在应用程序框上的端口上侦听(我已经以这种方式设置了 PHP FCGI 后端的应用程序集群) -- Nginx 只与 192.168.0.8:9001 对话,而不是 127.0.0.1:9001。干杯! 你能帮忙看看这个serverfault.com/questions/116589/…有什么问题吗【参考方案4】:

实际上,由于您使用的是 Nginx,因此您的状态已经很好,不需要 Apache。

您可以通过 fastcgi 运行 PHP(有示例说明如何执行此操作in the Nginx wiki),并在您的 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 脚本。

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于在与 Rails 应用程序相同的域上运行 Wordpress 的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在不安全的域上允许 cookie

CDO 在端口 465 和 587 上连接失败,但在 25 上工作

AWS CloudFront 分布在与 Web 服务器相同的域下

Sendgrid 集成:如何在与 CNAME 重定向相同的域上托管 AASA 文件

是否可以在同一个域上运行 Rails 应用程序和 React 应用程序?

Rails 对 service-worker.js 的未知调用