Jetty, GlassFish および TomcatのようなJavaサーバ¶
.warファイルを使ってデプロイすることができません。The application files need to be deployed into a folder, because the Java web application folder must be specified for NGINX so that it can find and directly send static files like images (.jpg, .png, .gif), stylesheets (.css) and JavaScript (.js) directly. これらのファイルはJavaサーバによって処理される必要がありません - NGINXにその仕事をさせます。
Jettyは一番良いパフォーマンスを持つため、この例のためにJettyを使います。
以下の例では、NGINXはJava サーバの前にあるリバースプロキシとして動作します。
Jetty上のwebアプリケーションのコンテキスト¶
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>
Java webアプリケーションへのパスを設定¶
root /PATH/TO/YOUR/WEB/APPLICATION;
Javaサーバのアドレスを設定¶
proxy_pass http://localhost:8080;
Javaサーバによって処理される拡張子とサーブレットのパスを設定¶
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サーバを守る¶
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.