一、nginx 代理多个 tomcat 应用 HTTPS
简介:
我们有
- 已经备案的域名
- 免费申请了一个 SSL 证书
- 一台学生机服务器
我们想做 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
或者是 域名
出现下面的界面就算是成功
或者是这种也算
这个界面的地址是
/usr/share/nginx/html/index.html
的界面,你可以自行修改.
2. 配置 nginx
2.1 上传 SSL 证书
将你的证书下载下来
以 我的 bmft.tech
证书为例
上传这 nginx 的文件夹下 2 个文件(安全证书和注册表项)到 Nginx 配置目录 /etc/nginx/
上传后的 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
再测试域名 + HTTPS 方式是否可用.
https://bmft.tech/yuyi/test
https://bmft.tech/leetcode/test
二、可能遇到的问题
1.nginx 反向代理 tomcat 出现 error 界面
出现 error 界面
)
检查错误日志
tail -f /var/log/nginx/error.log
这是 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)