当前位置: 首页 > news >正文

Ubuntu下Nginx的部署后端项目(Java为例),配置Nginx代理

一、后端项目部署

1.环境准备

确保服务器已安装java环境(JDK 17+):

java -version

若未安装

sudo apt update && sudo apt install openjdk-17-jdk

同时在服务器云平台安全组开放一个端口供后端使用(以下用8080端口为例)

添加规则,端口范围设置为8080,源地址设置为127.0.0.1/32(仅限服务器本地访问)

2.上传 JAR 包(Xftp)

将本地打包好的 JAR 文件(以app.jar为例)拖拽至服务器的/opt/app目录

设置权限

sudo chown root:root /opt/app/app.jar
sudo chmod 500 /opt/app/app.jar  # 禁止非root修改

3.部署服务(Xshell)

停止旧的服务(若存在)

#查找进程 PID
ps -ef | grep java#停止旧进程
kill -9 <PID># 确认进程已退出
ps -ef | grep java | grep -v grep  # 应无输出

启动 JAR 包 (指定8080端口)

cd /opt/app  # 进入 JAR 目录nohup java -jar app.jar --server.port=8080 > app.log 2>&1 &  # 后台运行并指定端口

验证服务

# 检查进程
ps -ef | grep java | grep 8080# 测试端口
curl -v http://localhost:9191/(后接后端写好的接口路径)
telnet 127.0.0.1 8080  # 应能连接# 查看日志
tail -f /opt/app/app.log

4.配置Systemd服务(持久化运行)

创建服务文件并写入配置

sudo tee /etc/systemd/system/app.service <<'EOF'
[Unit]
Description=App Service (Port 8080)
After=network.target[Service]
User=root
WorkingDirectory=/opt/app
ExecStart=/usr/bin/java -jar --server.port=8080 app.jar
SuccessExitStatus=143
Restart=always
RestartSec=30
StandardOutput=file:/var/log/app.log
StandardError=inherit[Install]
WantedBy=multi-user.target
EOF

启用服务

sudo systemctl daemon-reload
sudo systemctl start app
sudo systemctl enable app

5.关键注意事项

端口冲突检查

sudo netstat -tulnp | grep 8080  # 确保无其他服务占用

二、Nginx配置代理将前端请求转发到后端服务

1.若前端部署在同一个服务器

例如是blog.yourdomain.com 先将前端部署配置好,请看本文章

然后可以设置前端请求的 BaseURL/api

然后修改/etc/nginx/sites-available中的配置文件,此处为blog.yourdomain.com

# /etc/nginx/sites-available/blog.yourdomain.com
server {listen 80;server_name blog.yourdomain.com;return 301 https://$host$request_uri; # 强制HTTPS
}server {listen 443 ssl;server_name blog.yourdomain.com;# SSL证书ssl_certificate /etc/letsencrypt/live/blog.yourdomain.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/blog.yourdomain.com/privkey.pem;include /etc/letsencrypt/options-ssl-nginx.conf;ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;# 前端静态资源root /var/www/blog.yourdomain.com/html;index index.html;# 静态资源缓存(优化加载)location ~* \.(js|css|png|jpg|ico|svg)$ {expires 30d;access_log off;add_header Cache-Control "public";}# 后端API代理规则(核心!)location /api {# 代理到API专用域名(注意: 使用127.0.0.1提升安全性)proxy_pass http://127.0.0.1:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 跨域支持(与前端同域,无需额外CORS头)}# 日志管理access_log /var/log/nginx/blog.access.log combined;error_log /var/log/nginx/blog.error.log warn;
}

在原来的基础上添加后端API代理规则将请求代理到8080端口

修改好后保存退出然后测试重载Nginx服务

sudo nginx -t && sudo systemctl restart nginx

2.若前端部署在其他服务器

安全起见,需要给本服务器也搞个后端服务的专属域名,此处以api.yourdomain.com为例

可以设置前端请求的 BaseURL 为 api.yourdomain.com

首先同上先根据本文章给这个域名创建好链接,请看本文章(因为需要配置证书,这里先根据文章也给这个域名配置了简单的html文件)

然后修改/etc/nginx/sites-available中的配置文件,此处为api.yourdomain.com

# /etc/nginx/sites-available/api.yourdomain.com
server {listen 80;server_name api.yourdomain.com;return 301 https://$host$request_uri; # 强制HTTPS重定向
}server {listen 443 ssl;server_name api.yourdomain.com;# SSL证书(Certbot托管)ssl_certificate /etc/letsencrypt/live/api.yourdomain.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/api.yourdomain.com/privkey.pem;include /etc/letsencrypt/options-ssl-nginx.conf;ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;# 用户端直接访问路由location / {# 后端JAR服务(端口8080)proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# 增强安全性proxy_connect_timeout 60s;proxy_read_timeout 180s;}# 日志管理access_log /var/log/nginx/api.access.log combined;error_log /var/log/nginx/api.error.log warn;
}

在原来的基础上添加后端API代理规则将请求代理到8080端口,删去了前端静态资源的路径

修改好后保存退出然后测试重载Nginx服务

sudo nginx -t && sudo systemctl restart nginx

然后可以去/var/www/中将api.yourdomain.com文件夹删去(只用于获取证书,后续已无用)

3.测试

# 测试本服务器的前端项目直连API
curl -k https://blog.yourdomain.com/api/(后接后端写好的接口路径)# 测试其他服务器的前端项目直连API
curl -k https://api.yourdomain.com/(后接后端写好的接口路径)

成功返回数据说明代理成功(如下例子)

4.Nginx代理转发原理

a. ​​location匹配规则​

  • 当请求进入Nginx时,会根据location指令匹配请求的URI路径。

  • 例如:location /api会匹配以/api开头的所有请求。

b. ​​proxy_pass转发机制​

  • proxy_pass指令用于定义后端服务器的地址。

  • 转发行为取决于proxy_pass后是否包含路径:

    • ​情况A:proxy_pass末尾有斜杠(/)​

      例如:proxy_pass http://backend/;

      此时,匹配到的location路径(这里是/api)会被​​替换​​为proxy_pass指定的路径。

      请求:/api/user/dish/list→ 转发为:http://backend/user/dish/list

    • ​情况B:proxy_pass末尾没有斜杠​

      例如:proxy_pass http://backend;

      此时,匹配到的location路径(/api)会被​​追加​​到proxy_pass指定的地址后。

      请求:/api/user/dish/list→ 转发为:http://backend/api/user/dish/list

c.基本转发规则​

location /api {proxy_pass http://backend:port;
}
  • 请求路径​​:/api/user/dish/list

  • ​转发结果​​:http://backend:port/api/user/dish/list

  • ​关键点​​:location匹配的路径段 ​​会保留​​ 并追加到目标地址后

d.路径改写(移除前缀)

location /api {proxy_pass http://backend:port/;  # 注意结尾的/
}
  • ​请求路径​​:/api/user/dish/list

  • ​转发结果​​:http://backend:port/user/dish/list

  • ​关键点​​:结尾的 /会 ​​移除匹配的路径段​

三、后端服务更新

1.替换 JAR 包(核心)

# 停止旧服务
sudo systemctl stop app# 备份旧JAR(可选但推荐)
cp /opt/app/app.jar /opt/app/backup/app_$(date +%F).jar# 上传新JAR(使用Xftp)
# 新文件路径:/opt/app/app.jar# 设置权限
sudo chown root:root /opt/app/app.jar
sudo chmod 500 /opt/app/app.jar

2.重启服务(必须)

sudo systemctl start app# 检查状态
sudo systemctl status app

3.验证更新(关键)

# 检查日志
tail -f /opt/app/app.log# 测试接口
curl http://localhost:8080/(后接后端写好的接口路径)

http://www.dtcms.com/a/322910.html

相关文章:

  • 自编教材实操课程学习笔记
  • 商品、股指及ETF期权五档盘口Tick级与分钟级历史行情数据多维解析
  • dify离线插件安装
  • Spring Boot Starter 自动化配置原理深度剖析
  • 【工具变量】地市人力资本水平数据集(2003-2023年)
  • 聊聊经常用的微服务
  • Java 枚举解析:从基础到进阶的知识点与注意事项
  • 【完整源码+数据集+部署教程】植物生长阶段检测系统源码和数据集:改进yolo11-rmt
  • gRPC for C++ 实战全流程 —— 从零搭建到同步/异步服务
  • vw和vh:CSS中的视口相对单位
  • Linux下管道的实现
  • 第十四节 代理模式
  • Android 设置/修改系统NTP服务地址
  • 2010-2024 地级市、上市公司“信息惠民国家试点城市”DID
  • Jenkins全链路教程——条件判断与流程控制
  • 从夯到拉,锐评MC所有武器
  • RK3568笔记九十九:基于FFMPEG拉取RTSP流MPP硬解码视频显示
  • 第5章 Excel公式与函数应用指南(2):数学函数
  • 【C语言】深入探索预处理
  • 系统蓝屏,黑屏,花屏,绿屏,白屏等问题统一解决软件,驱动人生下载
  • SOLi-LABS Page-3 (Stacked injections) --39-53关
  • 在 Vue 中动态引入SVG图标的实现方案
  • spring声明式事务未提交引发的线上问题
  • Vue 3 + TypeScript:深入理解组件引用类型
  • 2025年渗透测试面试题总结-09(题目+回答)
  • 【自动化运维神器Ansible】playbook实践示例:HTTPD安装与卸载全流程解析
  • Blender 快捷键速查表 (Cheat Sheet)
  • 推荐系统学习笔记(十)多目标排序模型
  • “戴着镣铐”的AI推理:中国如何打破算力枷锁,赢得“最后一公里”?
  • Nvidia 开源 KO 驱动学习配置入门