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.