Rails アプリケーションと同じドメインで Wordpress を実行する最良の方法は何ですか?
-
01-07-2019 - |
質問
Nginx と Mongrel を備えた標準の Rails アプリを次の場所で実行しています。 http://私のドメイン. 。Wordpress ブログを運営する必要があります http://mydomain.com/ブログ. 。私の好みは、同じサーバーまたは別のボックスで実行されている Apache でブログをホストすることですが、ユーザーに URL 内に別のサーバーが表示されることは望ましくありません。それは可能ですか?可能でない場合、目標を達成するために何を推奨しますか?
解決
joelhardi のソリューションは次のソリューションよりも優れていると思います。ただし、私自身のアプリケーションでは、Rails サイトとは別の VPS にブログを保持することを好みます (メモリの問題の分離)。ユーザーに同じ URL を表示するには、別のボックスのポート 80 (またはその他) にプロキシすることを除いて、雑種クラスターへのプロキシに通常使用するのと同じプロキシ トリックを使用します。簡単にピーシー。ユーザーにとって、これは 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 アプリをシームレスに統合できます。
他のヒント
実際、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 が提案していることを実行し、CGI スポナーとして Lighttpd の spawn-fcgi を使用しています (Lighttpd は奇妙な依存関係がなく、非常に高速なコンパイルなので、インストールが素早く簡単です)。そのためには短いシェル/Perl スクリプトを使用してください。
上記の回答はあなたの質問にかなり答えています。
代替の FCGI は、php-fpm を使用することです。ドキュメントは少し少ないですが、うまく機能します。
今のNginx これを行うためのスクリプトを提供します EC2 / AWS 環境にいる場合。
あなたの状況に簡単に適応できるかもしれません。かなり便利ですよ。
書き換えマニピュレーターのようなものがあなたが望むことを行うように私には思えます。申し訳ありませんが、これ以上詳細はありません -- ただ声に出して考えただけです :)