.warファイルを使ってデプロイすることができません。Nginxがイメージ(.jpg, .png, .gif)、スタイルシート (.css) および JavaScript (.js) のような静的ファイルを見つけて直接送信できるように、Java webアプリケーションフォルダが指定されなければならないため、アプリケーションファイルはフォルダに配備される必要があります。これらのファイルはJavaサーバによって処理される必要がありません - NGINXにその仕事をさせます。
Jettyは一番良いパフォーマンスを持つため、この例のためにJettyを使います。
以下の例では、NGINXはJava サーバの前にあるリバースプロキシとして動作します。
jetty/contexts/YOUR_WEB_APPLICATION_FOLDER.xml
を編集することでwebアプリケーションのコンテキストを設定します。
resourceBase (YOUR_WEB_APPLICATION_FOLDER) と VirtualHost (YOUR_DOMAIN) を正しく設定するように注意してください。
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<Set name="configurationClasses">
<Array type="java.lang.String">
<Item>org.mortbay.jetty.webapp.WebInfConfiguration</Item>
<Item>org.mortbay.jetty.plus.webapp.EnvConfiguration</Item>
<Item>org.mortbay.jetty.plus.webapp.Configuration</Item>
<Item>org.mortbay.jetty.webapp.JettyWebXmlConfiguration</Item>
<Item>org.mortbay.jetty.webapp.TagLibConfiguration</Item>
</Array>
</Set>
<Set name="contextPath">/</Set>
<Set name="resourceBase"><SystemProperty name="jetty.home" default="."/>/webapps/YOUR_WEB_APPLICATION_FOLDER</Set>
<Set name="virtualHosts">
<Array type="java.lang.String">
<Item>YOUR_DOMAIN</Item>
</Array>
</Set>
<New id="YOUR_DB_NAME" class="org.mortbay.jetty.plus.naming.Resource">
<Arg>jdbc/YOUR_DB_NAME</Arg>
<Arg>
<New class="org.postgresql.ds.PGConnectionPoolDataSource">
<Set name="User">postgres</Set>
<Set name="Password">*****</Set>
<Set name="DatabaseName">YOUR_DB_NAME</Set>
<Set name="ServerName">localhost</Set>
<Set name="PortNumber">5432</Set>
</New>
</Arg>
</New>
</Configure>
root /PATH/TO/YOUR/WEB/APPLICATION;
proxy_pass http://localhost:8080;
location ~ \.do$ {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
location ~ \.jsp$ {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
location ^~/servlets/* {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
server {
listen 80;
server_name YOUR_DOMAIN;
root /PATH/TO/YOUR/WEB/APPLICATION;
location / {
index index.jsp;
}
location ~ \.do$ {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
location ~ \.jsp$ {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
location ^~/servlets/* {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}
Javaと同じサーバ上でNGINXを動作している場合、NGINXだけがアクセスできるようにポート80へのアクセスを拒否するのがベストプラクティスです。Linux上では以下のようにします
/sbin/iptables -A INPUT -p tcp -i eth0 --dport 8080 -j REJECT --reject-with tcp-reset
Jettyを使って1つだけのwebアプリケーションがある場合、localhostからだけJettyが動作するようにホストをlocalhostにバインドすることができます。
つまり、外部アクセスを保護するためにiptablesを設定する必要がありません。
conf/jetty.xml
上で
<Set name="host"><SystemProperty name="jetty.host" default="localhost"/></Set>
あるいは、組み込みのJettyサーバコード上で:
Server server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setHost("localhost"); // bind jetty to run only from localhost
connector.setPort(8080);
server.addConnector(connector);
server.start();
server.join();
参照
To embed a java handler in NGINX, check out Clojure.