一、nginx 代理多个 tomcat 应用 HTTPS

简介:
我们有

  1. 已经备案的域名
  2. 免费申请了一个 SSL 证书
  3. 一台学生机服务器
    我们想做 Nginx 代理我们服务器上的多个 tomcat web 应用,并支持 HTTPS 连接

1. 安装 nginx

这里推荐使用 yum 安装的方式

1.1 安装依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
1.2 安装 nginx
# 卸载 nginx(如果你安装了的话)
yum uninstall nginx 
# 安装
yum -y install nginx
# 开机 自启动
systemctl enable nginx

记得打开你的发防火墙的 443 80 和你的服务商的 443 80 端口

测试

访问的你的主机的 IP 或者是 域名 出现下面的界面就算是成功

nginx 配置多个路经 nginx配置多个http_centos


或者是这种也算

nginx 配置多个路经 nginx配置多个http_tomcat_02


这个界面的地址是

/usr/share/nginx/html/index.html

的界面,你可以自行修改.

2. 配置 nginx

2.1 上传 SSL 证书

将你的证书下载下来

以 我的 bmft.tech 证书为例

上传这 nginx 的文件夹下 2 个文件(安全证书和注册表项)到 Nginx 配置目录 /etc/nginx/

nginx 配置多个路经 nginx配置多个http_centos_03


上传后的 linux /etc/nginx 目录文件如下

[root@tx-gz-03 nginx]# ls
1_bmft.tech_bundle.crt  fastcgi.conf            koi-utf             nginx.conf          scgi_params.default
2_bmft.tech.key         fastcgi.conf.default    koi-win             nginx.conf.backup   uwsgi_params
conf.d                  fastcgi_params          mime.types          nginx.conf.default  uwsgi_params.default
default.d               fastcgi_params.default  mime.types.default  scgi_params         win-utf
2.2 修改 nginx.conf 文件

要部署2个tomcat项目分别是

http://localhost:9001/yuyi
http://localhost:9002/leetcode

/yuyi 和 /leetcode 都是项目的 context-path
要部署后的效果是

https://bmft.tech/yuyi
https://bmft.tech/leetcode

nginx.conf 文件

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    # 负载  yuyi.com 是负载upsteam的名称可以自定义
    upstream yuyi.com {
        # ip_hash;
        # 负载两台应用
        server    127.0.0.1:9001  weight=10;
    }
    upstream leetcode.com {
        # ip_hash;
        # 负载两台应用
        server    127.0.0.1:9002  weight=10;
    }
    # 这个 必须在 HTTP 中先定义
    #证书文件名称
    ssl_certificate  1_bmft.tech_bundle.crt;
    #私钥文件名称
    ssl_certificate_key 2_bmft.tech.key;
    server {
        listen 443 ssl;
        #填写绑定证书的域名
        server_name bmft.tech
        #证书文件名称
        ssl_certificate  1_bmft.tech_bundle.crt;
        #私钥文件名称
        ssl_certificate_key 2_bmft.tech.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        # 配置路径
        location / {
        }

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
        location /yuyi {
                port_in_redirect on;
                # 负载配置
                proxy_pass http://yuyi.com$request_uri;
                proxy_redirect  off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                add_header backendIP $upstream_addr;
                add_header backendCode $upstream_status;
        }
        location /leetcode {
                port_in_redirect on;
                # 负载配置 $request_uri 代表的是域名后面的所有内容,
                # 比如  https://bmft.tech/leetcode/all?id=123?name=zhnags
                # $request_uri 代表 /leetcode/all?id=123?name=zhnags
                # 更多参变量参数参考:
                # 后端 context-path: /leetcode 因为
                proxy_pass http://leetcode.com$request_uri;
                proxy_redirect  off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                add_header backendIP $upstream_addr;
                add_header backendCode $upstream_status;
        }
    }
    server {
        listen 80;
        #填写绑定证书的域名
        server_name _;
        #把http的域名请求转成https
        return 301 https://$host$request_uri;
    }

}

3. 启动 Nginx

如果运行了先将其停下来

service nginx stop

但是有坑是,进程可能在继续
我们通过端口监听找到它,然后 kill

# 端口监听找到
netstat -tunlp | grep 80
# 找到 PID 然后 kill,例如 PID 是 74743
kill 74743

然后重新启动

service nginx start

查看启动是否成功

service nginx status

启动成功

[root@tx-gz-03 ~]# service nginx status
Redirecting to /bin/systemctl status nginx.service
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2021-03-05 16:48:36 CST; 2h 31min ago
  Process: 10731 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 10729 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 10727 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 10733 (nginx)
    Tasks: 2
   Memory: 6.5M
   CGroup: /system.slice/nginx.service
           ├─10733 nginx: master process /usr/sbin/nginx
           └─10734 nginx: worker process

Mar 05 16:48:35 tx-gz-03 systemd[1]: Starting The nginx HTTP and reverse proxy server...
Mar 05 16:48:36 tx-gz-03 nginx[10729]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Mar 05 16:48:36 tx-gz-03 nginx[10729]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Mar 05 16:48:36 tx-gz-03 systemd[1]: Started The nginx HTTP and reverse proxy server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@tx-gz-03 ~]#

测试是否可以访问

注意:确保本机防火墙和运营商(阿里或者腾讯)防火墙都已经打开
先测试 原来的 ip 方式是否可用(这里可以替换为你自己的IP号码)
/test 是我写的一个测试接口,就是打印一个字符串,十分简单,这里可以用各种语言实现,注意将其,按照对应的端口运行到你的 服务器上

http://81.71.89.xx9:9001/leetcode/test
http://81.71.89.xx9:9000/yuyi/test

nginx 配置多个路经 nginx配置多个http_centos_04

再测试域名 + HTTPS 方式是否可用.

https://bmft.tech/yuyi/test
https://bmft.tech/leetcode/test

nginx 配置多个路经 nginx配置多个http_nginx 配置多个路经_05

二、可能遇到的问题

1.nginx 反向代理 tomcat 出现 error 界面

出现 error 界面

)

nginx 配置多个路经 nginx配置多个http_nginx_06


检查错误日志

tail -f /var/log/nginx/error.log

nginx 配置多个路经 nginx配置多个http_linux_07


这是 selinux 的权限的问题

解决方法

先关掉selinux:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
或者
setenforce 0
再执行下面的命令,修改selinux的值:
setsebool -P httpd_can_network_connect 1
再次测试,访问OK(测试系统是centos7,selinux已经关闭,这里只需要执行最后一条命令)

参考:

SSL 证书 Nginx 服务器 SSL 证书安装部署 - 最佳实践 - 文档中心 - 腾讯云 (tencent.com)