はじめに
Nginxをリバースプロキシとして利用する際に、.confファイルを作って、locationにproxy_passを設定しますが、書き方によって結果的に出来上がるパスが変わります。
分かってはいるものの、すぐにどっちがどっちだったから忘れてしまうので、メモ的に記事として挙げさせていただきます。
環境
docker-composeで以下のような感じでNginxとAsp.Net(API)を作成しています。demoコンテナーがAPIです。以前の記事で使用したものですので、詳細はそちらをご覧ください。
services:
nginx:
volumes:
- nginxconf:/etc/nginx/conf.d
- www:/var/www/html
ports:
- 80:80
networks:
- front-back
demo:
expose:
- 5000
networks:
- front-back
nginxがport:80でListenしていて、http://localhost
にアクセスした場合はindex.htmlが表示されます。
このあと、http://localhost/demo/
と入力した場合の動作が以下の設定によって変わります。
設定その1
proxy_passの最後に / をつける
server {
listen 80;
server_name default_server;
root /var/www/html;
index index.php index.html index.html;
location / {
try_files $uri $uri/ /index.php /index.html;
}
location /sample/ {
#ここ↓
proxy_pass http://demo:5000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
この場合、http://localhost/sample/
と入力すると、http://demo:5000/sample/
にパスされます。
設定その2
proxy_passの最後に / をつけない
server {
listen 80;
server_name default_server;
root /var/www/html;
index index.php index.html index.html;
location / {
try_files $uri $uri/ /index.php /index.html;
}
location /sample/ {
#ここ↓
proxy_pass http://demo:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
この場合、http://localhost/sample/
と入力すると、http://demo:5000/
にパスされます。
まとめ
- "/" をつけたら、locationで書かれているパスがその後に追記される。
- "/" がない場合、locationで書かれているパスに入れ替わる。
なんとなく設定ファイルを作ったり、コピペをしていて、うまく動作しないというときに、見直すべきポイントのひとつですね。