ネットワーク構成
DMZゾーンにフロントサーバーAを配置し、バックエンドにアプリケーションサーバーB(Tomcat)、データベースサーバーCを配置する。 サーバーAでnginxを使用してリバースプロキシを構築する。
初期設定
サーバーA(IP: 10.100.50.20)nginx.confに設定を追加した内容は以下の通り:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8080;
server_name 10.100.50.20;
location / {
index index.jsp index.html index.htm;
proxy_pass http://10.100.50.30:8090/webapp/;
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;
client_max_body_size 20m;
client_body_buffer_size 256k;
proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;
proxy_buffer_size 8k;
proxy_buffers 8 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
}
location ~ .*\.(js|css|png|jpg|jpeg|gif|ico)$ {
proxy_pass http://10.100.50.30:8090;
}
add_header X-Proxy-Server $server_addr;
add_header X-Cache-Status $upstream_cache_status;
}
}
問題1:proxy_passのURI設定
以下の設定でURIの末尾に"/"を付けるかどうかで悩んだ。従来の経験则认为不加"/"が正しいと思っていた。しかし、バックエンドBがTomcatの仮想パスを 운영하고"/webapp"にアクセスすると自動的に"/webapp/"にリダイレクトされるため、ここでは"/"を付けることにした。
location / {
index index.jsp index.html index.htm;
proxy_pass http://10.100.50.30:8090/webapp/;
}
問題2:静的リソースの読み込みエラー
ページをブラウザで開くとjs/cssファイルが読み込めなかった。リクエストURLが「http://10.100.50.20/webapp/main.js」のように変換されていたため、以下の通り修正を試みた:
location ~ .*\.(js|css)$ {
proxy_pass http://10.100.50.30:8090/webapp/;
}
しかし、nginx起動時にエラーとなった。正規表現を使用したlocationブロックではURIパスを指定できない制約があるためである。
代わりに、静的リソースをサーバーAに直接 配置することにした。パスはサーバーBと一致させる:
location ~ .*\.(js|css)$ {
root /var/www/static;
}
設定後、正常に動作することを確認した。
問題3:proxy_passで静的リソースを処理する方法
もしproxy_pass経由で静的リソースを処理したい場合は、locationパターンを変更する:
location /static/ {
proxy_pass http://10.100.50.30:8090;
}
この設定で正常にアクセス可能となる。
問題4:rewriteルールでの実装
rewriteを使用したかったが実現できず、現在は継続調査中である:
location ~ .*\.(js|css)$ {
rewrite ^/(.*)$ /webapp/$1 break;
proxy_pass http://10.100.50.30:8090;
}
問題5:HostヘッダーのPort情報
внешнийIP:PortAでアクセスしたところ、HostヘッダーがIP:8090のようにバックエンドポートに書き換わってしまう現象が発生した。現時点では再現していないが、次回発生時の対応として以下のように修正すると良い:
proxy_set_header Host $host;
#以下に変更
proxy_set_header Host $host:$server_port;