サイトのWebルートディレクトリの外部にあるディレクトリ/アプリケーションがあります。
サイトがここにあるとしましょう:
/var/www/site/htdocs/
外部アプリは次の場所にあります。
/var/www/apps/coolapp/
私の質問は、www.mysite.com/coolapp/*
(アスタリスクはワイルドカード)のようなすべてのリクエストを外部の場所/var/www/apps/coolapp/
にマッピング/ルーティングするようにnginxを構成するにはどうすればよいですか?たとえば、www.mysite.com/coolapp/test.phpは/var/www/apps/coolapp/test.php
をサーバーにする必要があります。
@krokolaの回答に従って、メインproduction.conf
ファイルに含まれるnginx.conf
ファイルにalias
ディレクティブを追加しようとしました。 production.conf
の現在の状態は次のとおりです
server {
listen 80;
listen 443 ssl;
ssl_certificate /blah/blah/blah;
ssl_certificate_key /blah/blah/blah;
ssl_protocols blah blah blah;
ssl_ciphers blahblahblah;
ssl_prefer_server_ciphers blahblah;
access_log /var/log/nginx/www.mysite.com-access.log;
error_log /var/log/nginx/www.mysite.com-error.log error;
server_name mysite.com www.mysite.com;
root /var/www/site/htdocs;
include conf/magento_rewrites.conf;
include conf/magento_security.conf;
include /var/www/site/nginx/*.conf;
#-------CODE IN QUESTION-------
location /coolapp/ {
alias /var/www/apps/coolapp/;
location ~ \.php {
# Copied from "# PHP Handler" below
fastcgi_param MAGE_RUN_CODE default;
fastcgi_param MAGE_RUN_TYPE store;
fastcgi_param HTTPS $fastcgi_https;
rewrite_log on;
# By default, only handle fcgi without caching
include conf/magento_fcgi.conf;
}
}
# PHP handler
location ~ \.php {
## Catch 404s that try_files miss
if (!-e $request_filename) { rewrite / /index.php last; }
## Store code is defined in administration > Configuration > Manage Stores
fastcgi_param MAGE_RUN_CODE default;
fastcgi_param MAGE_RUN_TYPE store;
fastcgi_param HTTPS $fastcgi_https;
rewrite_log on;
# By default, only handle fcgi without caching
include conf/magento_fcgi.conf;
}
# 404s are handled by front controller
location @magefc {
rewrite ^(.*) /index.php?$query_string last;
}
# Last path match hands to magento or sets global cache-control
location / {
## Maintenance page overrides front controller
index index.html index.php;
try_files $uri $uri/ @magefc;
expires 24h;
}
}
conf/magento_fcgi.confは次のようになります。
fastcgi_pass phpfpm;
## Tell the upstream who is making the request
proxy_set_header Host $Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
# Ensure the admin panels have enough time to complete large requests ie: report generation, product import/export
proxy_read_timeout 1600s;
# Ensure PHP knows when we use HTTPS
fastcgi_param HTTPS $fastcgi_https;
## Fcgi Settings
include fastcgi_params;
fastcgi_connect_timeout 120;
fastcgi_send_timeout 320s;
fastcgi_read_timeout 1600s;
fastcgi_buffer_size 128k;
fastcgi_buffers 512 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors off;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
# nginx will buffer objects to disk that are too large for the buffers above
fastcgi_temp_path /tmpfs/nginx/tmp 1 2;
#fastcgi_keep_conn on; # NGINX 1.1.14
expires off; ## Do not cache dynamic content
エイリアスを設定する必要があります。
location /coolapp/ {
alias /var/www/apps/coolapp/;
}
続きを読む nginx
コメント後に更新:
残念ながら、それは私のために働いていません。 /var/www/apps/coolapp/test.phpが存在するときにwww.mysite.com/coolapp/test.phpをリクエストしようとすると、404応答が返されます。
エイリアスが機能しない理由を理解するには、nginxがリクエストを処理する方法を確認する必要があります。 request_processing
マニュアルから:
Nginxは、リストされた順序に関係なく、リテラル文字列で指定された最も具体的なプレフィックスの場所を最初に検索します。上記の構成では、プレフィックスの場所は「/」のみであり、リクエストと一致するため、最後の手段として使用されます。次に、nginxは、構成ファイルにリストされている順序で正規表現で指定された場所をチェックします。最初に一致する式は検索を停止し、nginxはこの場所を使用します。要求に一致する正規表現がない場合、nginxは以前に見つかった最も具体的なプレフィックスの場所を使用します。
要求に一致する正規表現がある場合、静的プレフィックスをオーバーライドします。構成で、/ var/www/apps/coolapp/test.phpにアクセスすると、2つの場所が一致します。
2番目の場所は正規表現であるため、最初の場所はオーバーライドされます。ただし、/ var/www/apps/coolapp/test.htmlなどのhtmlファイルにアクセスしている場合、1つの場所(エイリアスの場所)しか見つからないため、期待どおりに動作します。
エイリアスパスでphpにアクセスする問題を修正し、デフォルトのphpの場所を上書きするには、エイリアスの場所内にネストされた場所を追加し、ネストされた場所でphpファイルを呼び出すときに何でもします。構成では、これは次のようになります。
location /coolapp/ {
alias /var/www/apps/coolapp/;
location ~ \.php {
Do whatever is needed
}
}
例を見つけることができます here