通过Nginx在一台服务器部署多个Web应用
通过Nginx在一台服务器部署多个Web应用通过nginx的反向的代理,可以监听80(http)和443(https)两个默认端口,然后将这两个2个端口的请求映射到项目实际运行的端口上。这里首先说明,通过一个nginx配置反向代理多个项目,可以通过请求路径进行区分,也可以通过请求域名的不同进行区分。能否根据请求路径区分主要取决于项目是否支持非根路径(例如:baidu.com/a 则不是根路径,
通过Nginx在一台服务器部署多个Web应用
通过nginx的反向的代理,可以监听80(http)和443(https)两个默认端口,然后将这两个2个端口的请求映射到项目实际运行的端口上。
这里首先说明,通过一个nginx配置反向代理多个项目,可以通过请求路径进行区分,也可以通过请求域名的不同进行区分。能否根据请求路径区分主要取决于项目是否支持非根路径(例如:baidu.com/a 则不是根路径,多了一个请求路径a)
一台服务器上部署多个项目,并能被外网正确访问
0. 安装nginx
首先需要在服务器安装nginx,这里使用的nginx-1.18.0
。
具体安装可以参考这篇文章:https://www.cnblogs.com/lywJ/p/10710361.html
1. 在服务器上运行所有项目
假设有两个项目,现都已经打包成jar(内置tomcat),分别是apple.jar,banana.jar。
可以使用以下命令启动两个项目
nohup java -jar apple.jar &
nohup java -jar banana.jar &
可以将命令写入一个shell文件,如start.sh,只需要执行sh start.sh
命令即可启动项目
#!/bin/bash
nohup java -jar apple.jar &
nohup java -jar banana.jar &
# nohup 表示后台挂起;& 表示将项目的打印信息写入nohup.out文件中
# 另外可以通过在命令后追加 --server.port=8080 的方式,改变原本的项目配置
或者可以通过简单的判断,得知每次是否启动成功
#!/bin/bash
# 以 apple.jar为例
echo "application is starting"
nohup java -jar apple.jar &
# wait for 10s, judge if the app is running
sleep 10
# check whrether the project is started successfully
if test $(pgrep -f apple|wc -l) -eq 0
then
echo "Application Start Failed"
else
echo "Application Start Successed"
fi
# Find the apple.jar process
ps -ef | grep apple
关闭项目的命令也可以编写为一个shell文件:stop.sh
#!/bin/bash
# 以apple.jar为例
PID=$(ps -ef | grep apple.jar | grep -v grep | awk '{ print $2 }')
if [ -z "$PID" ]
then
echo Application is already stopped
else
echo kill $PID
kill $PID
fi
现假设,apple.jar占用8080端口,banana.jar占用8081端口
2. 配置 nginx
说明:以下内容涉及配置https,所以假设域名为
test.cn
建议:在修改nginx.conf之前应当先复制一份,以防修改错误,可以随时复原。
cp conf/nginx.conf conf/nginx_copy.conf
1️⃣:通过请求路径进行区分
# HTTPS server
server {
listen 443 ssl;
server_name localhost;
# ssl 证书(nginx版本)的位置,一个pem文件,一个key文件
ssl_certificate /usr/local/nginx/ssl/test.cn_bundle.pem;
ssl_certificate_key /usr/local/nginx/ssl/test.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# apple.jar project
location /a {
proxy_pass http://localhost:8080/a/;
}
# banana.jar project
location /b {
proxy_pass http://localhost:8081/b/;
}
}
注意:通过请求路径区分,最好项目的根路径要与请求路径相同(即:location /a 和 localhost:8080/a 这两个 /a
是相同),否则可能出现问题。因为如果项目不是所有api和静态资源都加了一个路径 /a
,那么在请求静态资源的时候就会出现404,因为它通过根路径请求的(如:https://test.cn/xxx.css,,没有加上请求路径 /a
),所以找不到相应的资源。
2️⃣:通过域名进行区分
一个域名可以拥有多个二级域名,所以可以借助二级域名进行区分不同的应用,如:a.test.cn
,b.test.cn
。购买了一级域名后只需要在DNS解析中添加相应二级域名与服务器进行绑定即可。 ===> 参考
现假设有域名test.cn和二级域名b.test.cn,两个域名都与服务器106.52.230.210,进行绑定。
注意:如果需要配置https,则主域名和二级域名都需要申请免费ssl证书,两者是不同的,但是也有通配ssl证书,主域名和二级域名可以通用,但是需要花钱
配置nginx
##### apple.jar project #####
server {
listen 443 ssl;
# server_name localhost;
server_name test.cn;
ssl_certificate /usr/local/nginx/ssl/test.cn_bundle.pem;
ssl_certificate_key /usr/local/nginx/ssl/test.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# mangshangxiadan project
location / {
proxy_pass https://localhost:8080/;
}
}
###### banana.jar project #####
server {
listen 443 ssl;
server_name b.test.cn;
ssl_certificate /usr/local/nginx/ssl/b.test.cn_bundle.pem;
ssl_certificate_key /usr/local/nginx/ssl/b.test.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:8081/;
}
# modify the maximum file upload size
client_max_body_size 2000m; # 如果有文件上传和下载功能需要注意修改为合适的值,默认为 1m
}
以上nginx都是配置了https,至于http则大同小异,只是不需要配置ssl证书和监听端口不同。 ===> 参考
其他
配置http自动跳转到https
# http change to https
server {
listen 80;
server_name survey.jxausc.cn;
#将请求转成https
rewrite ^(.*)$ https://$host$1 permanent;
}
注意:
- 服务器开启防火墙后需要开放相应端口
- 使用阿里云,腾讯云等,有相应的安全组策略,如果无法访问到相应端口,需要进行配置
📘 参考资料
更多推荐
所有评论(0)