NginxをWebフロントエンドとして使用し、Apache2をWebバックエンドとして使用しています。 Apacheは複数のWebサイトをローカルで実行し、nginxはそれらにアクセスします。
現在、さまざまなサブドメインがホストされていますが、nginxのおかげで、http://my-single-domain.com/subdomain-alias
を使用してそれらを単一のサブドメインに移行したいと考えています。
ルートディレクトリとApache2 vhostポートは、サブドメインごとに異なります(当然のことですね)。
いくつかの構成を試しましたが、送信されているリソースを取得できません。つまり、インデックスhtmlは送信されましたが、ルールroot
が設定されているにもかかわらず、サーバー(404 Not Found
)によってリソースが見つかりません。
私はいくつかの解決策を試しました:
location /alias1 {
proxy_pass http://127.0.0.1:9095/;
include /etc/nginx/proxy.conf;
}
または
location /alias1 {
alias /alias1/;
proxy_pass http://127.0.0.1:9095/;
include /etc/nginx/proxy.conf;
}
あるいは
location /alias1/ {
rewrite ^/alias1(/.*)$ $1 break;
proxy_pass http://127.0.0.1:9095/;
}
または再び
location /alias1/ {
rewrite ^/alias1(/.*)$ $1 break;
proxy_pass http://127.0.0.1:9095/;
proxy_set_header Host $Host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
このセットアップの何が問題になっていますか?年齢/alias1/page
が要求されたときに特定のルートディレクトリからアセットを取得するようにnginxを設定するにはどうすればよいですか?
最初に尋ねられた webmasters.stackexchange.com
--- ### /etc/nginx/proxy.conf 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; proxy_set_header X-Forwarded-Proto https; #client_max_body_size 10m; #client_body_buffer_size 128k; proxy_connect_timeout 90; #proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffers 32 4k;
user www-data www-data;
worker_processes 2;
pid /var/run/nginx.pid;
worker_rlimit_nofile 1024;
events {
worker_connections 512;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile "on";
tcp_nopush "on";
tcp_nodelay "on";
keepalive_timeout "65";
access_log "/var/log/nginx/access.log";
error_log "/var/log/nginx/error.log";
server_tokens off;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*/*;
}
server {
listen 443;
ssl on;
ssl_certificate /etc/ssl/private/single-domain.com-with_chain.crt;
ssl_certificate_key /etc/ssl/private/single-domain.com.key.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/private/dhparams.pem;
server_name www.single-domain.com;
location / {
proxy_pass http://127.0.0.1:8090/;
include /etc/nginx/proxy.conf;
}
location /alias/ {
proxy_redirect off;
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:8103/;
proxy_set_header Host alias.single-domain.com;
root /var/www/alias.single-domain.com;
}
location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx|otf|eot|svg|ttf|woff)$ {
root /var/www/single-domain.com/public;
proxy_buffering on;
proxy_cache_valid 200 120m;
expires 864000;
}
access_log /var/log/nginx/single-domain.com/www-access.log;
error_log /var/log/nginx/single-domain.com/www-error.log;
}
Apacheがドメイン_9095
_のポート_sub1.example.com
_およびドメイン_9096
_のポート_sub2.example.com
_をリッスンしていて、nginxが最初に_http://www.example.com/alias1
_を渡したい場合、および_http://www.example.com/alias2
_を2番目のApache virtualhostに追加するには、次のようにします。
_location /alias1/ {
proxy_redirect off;
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:9095/;
proxy_set_header Host sub1.example.com;
}
location /alias2/ {
proxy_redirect off;
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:9096/;
proxy_set_header Host sub2.example.com;
}
_
次に、たとえば_http://your-single-domain.example.com/alias1/foo/page1.html
_でのnginxへの元のリクエストは、_http://sub1.example.com:9095/foo/page1.html
_に送信されたかのようにApacheに転送されます。
そして、_http://your-single-domain.example.com/alias2/bar/baz/page2.html
_でのnginxへの元のリクエストは、_http://sub2.example.com:9096/bar/baz/page2.html
_に送信されたかのようにApacheに転送されます。
Update1(概念実証):nginxがonly構成ファイルを持つ上記のように、netcatを_nc -l -p 9095
_として実行し(Apacheはこのデバッグでそのポートをリッスンしてはいけません)、ブラウザ_http://www.single-domain.com/alias1/assets/style.css
_で開きます。 netcatの出力には次のように表示されます。
_GET /assets/style.css HTTP/1.1
Host: sub1.example.com
Connection: close
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.6.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
_
Netcatの代わりにポート9095でリッスンしているApacheがあった場合、URL " http://sub1.example.com/assets/style.css "(これは_/var/log/Apache2/access_log
_または同等のもので示される)
_location /alias1/
_はURLの_/alias1/
_の部分を自動的に削除するため、rewrite ^/alias1(/.*)$ $1 break;
は不要です。
yournginx設定ファイルを使用しているときに異なる出力が得られる場合、それはnginxで競合するディレクティブがあることを意味します-その場合、この設定だけから始めることをお勧めします答え、機能することを確認してから、壊れるまで古い構成ブロックを1つずつ追加していきます。変更すると、競合するブロックが発生します。
Update2:nginx設定を投稿したので、それは明らかです-すべての_.css
_ファイルを示す場所のオーバーライドがあります(他のファイル)は、_/var/www/single-domain.com/public
_からnginxで直接提供されます。削除または編集すると、Apacheを通過します。