背景: 前端是nuxt3开发, 后端是由golang开发, 在 RockyLinux 中进行部署使用 nginx 代理
1. 配置前端和后端的 systemctl 服务
在 /etc/systemd/system 目录下, 创建前端的 xxx-frontend.service 文件
[Unit]
Description=zhzxxj frontend
After=network.target
Wants=network.target
[Service]
User=appuser
Group=appuser
WorkingDirectory=/opt/zhzxxj-frontend
ExecStart=/usr/bin/node /opt/zhzxxj-frontend/server/index.mjs
# Environment="NUXT_PUBLIC_API_BASE_URL=https://api.your-domain.com"
Restart=always
RestartSec=60
TimeoutStartSec=30
TimeoutStopSec=10
[Install]
WantedBy=multi-user.target
创建后端的 xxx-backend.service 文件
[Unit]
Description=zhzxxj backend
After=network.target mysql.service
Wants=network.target mysql.service
[Service]
User=appuser
Group=appuser
WorkingDirectory=/opt/zhzxxj-backend
ExecStart=/opt/zhzxxj-backend/zhzxxj
Environment="ZHZXXJ_ENV=prod"
Restart=always
RestartSec=60
TimeoutStartSec=30
TimeoutStopSec=10
[Install]
WantedBy=multi-user.target
然后刷新 systemctl
systemctl daemon-reload
然后就可以启动前端和后端
systemctl start xxx-frontend
systemctl start xxx-backend
2. 配置 nginx
server {
listen 80;
location /api/ {
proxy_pass http://localhost:8088/;
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;
}
location / {
proxy_pass http://localhost:3000/;
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;
}
}
3. 如果访问报 502 错误, 看 nginx 的 error.log 日志中有权限问题日志
*12 connect() to 127.0.0.1:3000 failed (13: Permission denied) while connecting to upstream
应该是 SELinux 的 httpd_can_network_connect 问题
getsebool httpd_can_network_connect
返回
httpd_can_network_connect --> off
# 那么执行下面命令 -P 表示永久生效
setsebool -P httpd_can_network_connect on
4. 如果查看服务启动日志, 发现莫名的权限问题, 可以尝试以下方式解决
# 查看服务启动日志
journalctl -u zhzxxj-backend -f
#临时关闭SELinux
setenforce 0
#恢复SELinux
setenforce 1
#查看SELinux状态
getenforce
重新恢复SELinux上下文
restorecon -Rv /opt/zhzxxj-backend