Перейти к содержанию

Java Servers

NGINX works as a reverse proxy in front of Java application servers like Jetty, GlassFish, and Tomcat.

Deployment

You cannot deploy using .war files directly. The application must be deployed into a folder so NGINX can serve static files (images, CSS, JavaScript) directly without involving the Java server.


Basic Configuration

server {
    listen 80;
    server_name YOUR_DOMAIN;
    root /PATH/TO/YOUR/WEB/APPLICATION;

    location / {
        index index.jsp;
    }

    # Proxy .do requests to Java server
    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;
    }

    # Proxy .jsp requests to Java server
    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;
    }

    # Proxy servlet paths to Java server
    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;
    }
}

Jetty Context Configuration

Configure your web application context in jetty/contexts/YOUR_APP.xml:

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" 
    "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
    <Set name="contextPath">/</Set>
    <Set name="resourceBase">
        <SystemProperty name="jetty.home" default="."/>/webapps/YOUR_APP
    </Set>
    <Set name="virtualHosts">
        <Array type="java.lang.String">
            <Item>YOUR_DOMAIN</Item>
        </Array>
    </Set>
</Configure>

Securing the Java Server

If NGINX and Java run on the same server, block external access to port 8080:

Using iptables

/sbin/iptables -A INPUT -p tcp -i eth0 --dport 8080 -j REJECT --reject-with tcp-reset

Binding Jetty to localhost

In conf/jetty.xml:

<Set name="host">
    <SystemProperty name="jetty.host" default="localhost"/>
</Set>

Or in embedded Jetty code:

Server server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setHost("localhost");  // bind to localhost only
connector.setPort(8080);
server.addConnector(connector);
server.start();
server.join();

Upstream with Load Balancing

For multiple Java servers:

upstream java_backend {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

server {
    listen 80;
    server_name YOUR_DOMAIN;
    root /PATH/TO/YOUR/WEB/APPLICATION;

    location / {
        index index.jsp;
    }

    location ~ \.(do|jsp)$ {
        proxy_pass http://java_backend;
        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;
    }
}