Jetty, GlassFish および TomcatのようなJavaサーバ

.warファイルを使ってデプロイすることができません。Nginxがイメージ(.jpg, .png, .gif)、スタイルシート (.css) および JavaScript (.js) のような静的ファイルを見つけて直接送信できるように、Java webアプリケーションフォルダが指定されなければならないため、アプリケーションファイルはフォルダに配備される必要があります。これらのファイルは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();

参照

NGINX に java ハンドラを埋め込むには、Clojure を調べてください。

inserted by FC2 system