5.4. Tomcat 的代理设置

对于系统集成的情况,可能需要一个代理服务器。本章节介绍配置 Nginx HTTP-server 作为 CUBA 应用程序的代理服务。



设置代理的时候,别忘了设置 cuba.webAppUrl 的值。

NGINX

对于 Nginx,下面有两种配置方法,所有示例都在 Ubuntu 16.04 测试通过。


-
Direct Proxy - 直接代理

-
Redirect to Path - 转发路径

假设,web 应用程序运行在 http://localhost:8080/app



Tomcat 也需要增加一点配置。

Tomcat 配置




首先,在 Tomcat 配置文件 conf/server.xml 中添加 Valve 属性,拷贝粘贴以下代码:





  1. <Valve className="org.apache.catalina.valves.RemoteIpValve"
    remoteIpHeader="X-Forwarded-For"
    requestAttributesEnabled="true"
    internalProxies="127.0.0.1" />






然后重启 Tomcat 服务:





  1. sudo service tomcat8 restart






这个配置可以使得不需要修改 web 应用程序的情况下使用 Tomcat 来分发 Nginx headers。



然后安装 Nginx:





  1. sudo apt-get install nginx






浏览器打开 http://localhost 确保 Nginx 能工作,应该打开的是 Nginx 的欢迎页面。



现在可以删除默认 Nginx 网页的符号链接(symlink)了:





  1. rm /etc/nginx/sites-enabled/default






下一步,按照下面两种方式的任意一种配置代理。

直接代理




直接代理的情况下,网页请求都是由代理处理,然后直接透明的转发给应用程序。



创建 Nginx 网站配置文件 /etc/nginx/sites-enabled/direct_proxy





  1. server {
    listen 80;
    server_name localhost;

    location /app/ {
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-Proto $scheme;

    # Required to send real client IP to application server
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;

    # Optional timeouts
    proxy_read_timeout 3600;
    proxy_connect_timeout 240;
    proxy_http_version 1.1;

    # Required for WebSocket:
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_pass http://127.0.0.1:8080/app/;
    }
    }






重启 Nginx:





  1. sudo service nginx restart






现在可以通过 http://localhost/app 访问应用程序。



转发路径




这个例子说明如何将应用程序的 URL 路径从 /app 更换成 /,就像应用程序是直接部署在根目录(类似部署在/ROOT 的效果)。这种方法允许通过 http://localhost 访问应用程序。



创建 Nginx 网站配置文件 /etc/nginx/sites-enabled/root_proxy





  1. server {
    listen 80;
    server_name localhost;

    location / {
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-Proto $scheme;

    # Required to send real client IP to application server
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;

    # Optional timeouts
    proxy_read_timeout 3600;
    proxy_connect_timeout 240;
    proxy_http_version 1.1;

    # Required for WebSocket:
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_pass http://127.0.0.1:8080/app/;

    # Required for folder redirect
    proxy_cookie_path /app /;
    proxy_set_header Cookie $http_cookie;
    proxy_redirect http://localhost/app/ http://localhost/;
    }
    }






然后重启 Nginx





  1. sudo service nginx restart






现在可以通过 http://localhost 访问应用程序。





类似的部署指令对于 JettyWildFly 等等 web 服务器也有效。但是可能也需要对这些 web 服务器添加一些额外的配置。