nginx reverse proxy settings for Tomcat application

ネットワーク構成

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;

5月27日 03:13 投稿