http://mydomainで Nginx と Mongrel を実行する標準の Rails アプリを持っています。http://mydomain.com/blogで Wordpress ブログを運営する必要があります。私の好みは、同じサーバーまたは別のボックスで実行されている Apache でブログをホストすることですが、ユーザーに URL で別のサーバーを表示させたくありません。それは可能ですか?不可能な場合、目標を達成するために何をお勧めしますか?
5 に答える
実際、あなたは Nginx を使用しているので、すでに調子が良く、Apache は必要ありません。
fastcgi を介して PHP を実行し ( 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 スポーナーとして使用します (Lighttpd は奇妙な依存関係のない非常に高速なコンパイルであるため、すばやく簡単にインストールできます)。そのために短いシェル/Perl スクリプトを使用します。
joelhardi のソリューションは、以下よりも優れていると思います。ただし、自分のアプリケーションでは、ブログを Rails サイトとは別の VPS に保持したいと考えています (メモリの分離の問題)。ユーザーに同じ URL を表示するには、別のボックスのポート 80 (またはその他) にプロキシすることを除いて、mongrel クラスターにプロキシするために通常使用するのと同じプロキシ トリックを使用します。簡単です。ユーザーにとっては、mongrel にプロキシするのと同じくらい透過的です。ユーザーは、ドメインのポート 80 で応答する NGINX のみを「見る」ことができます。
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 アプリを簡単に統合できます。
上記の回答は、あなたの質問にかなり答えています。
代替の FCGI は、php-fpm を使用することです。ドキュメントは少しまばらですが、うまく機能します。
EC2 / AWS 環境にいる場合 、 Nginx はこれを行うためのスクリプトを提供するようになりました。
あなたの状況に合わせやすいかもしれません。それはかなり便利です。
書き換えマニピュレータのようなものがあなたが望むことをするように私には思えます。申し訳ありませんが、これ以上の詳細はありません。声に出して考えているだけです:)