通过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.cnb.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;
}

注意

  • 服务器开启防火墙后需要开放相应端口
  • 使用阿里云,腾讯云等,有相应的安全组策略,如果无法访问到相应端口,需要进行配置

📘 参考资料

  1. 腾讯云添加二级域名
  2. Nginx单服务器部署多个网站,域名
  3. 让你一台服务器支持http和https同时运行多个项目(jar包和war包部署)
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐