fix: 使用 root 用户启动 Nginx,后端应用以 appuser 运行

- Nginx 以 root 用户运行(解决 80 端口绑定权限问题)
- 后端应用以 appuser 用户运行(保持安全性)
- 移除 setcap 相关配置(不再需要)
- 更新目录权限设置(Nginx 相关目录使用 root,应用目录使用 appuser)
This commit is contained in:
WrBug
2025-12-03 05:34:26 +08:00
parent 5451dd87e5
commit f33f03a4a8
3 changed files with 15 additions and 16 deletions
+12 -13
View File
@@ -38,11 +38,9 @@ WORKDIR /app
# 安装 Nginx 和必要的工具 # 安装 Nginx 和必要的工具
RUN apt-get update && \ RUN apt-get update && \
apt-get install -y nginx curl libcap2-bin && \ apt-get install -y nginx curl && \
rm -rf /var/lib/apt/lists/* && \ rm -rf /var/lib/apt/lists/* && \
rm -rf /etc/nginx/sites-enabled/default && \ rm -rf /etc/nginx/sites-enabled/default
# 给 Nginx 二进制文件设置权限,允许非 root 用户绑定 80 端口
setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx || true
# 从构建阶段复制文件 # 从构建阶段复制文件
COPY --from=frontend-build /app/frontend/dist /usr/share/nginx/html COPY --from=frontend-build /app/frontend/dist /usr/share/nginx/html
@@ -55,20 +53,21 @@ COPY docker/nginx.conf /etc/nginx/nginx.conf
COPY docker/start.sh /app/start.sh COPY docker/start.sh /app/start.sh
RUN chmod +x /app/start.sh RUN chmod +x /app/start.sh
# 创建非 root 用户(必须先创建用户,然后才能使用 chown # 创建非 root 用户(用于运行后端应用
RUN useradd -m -u 1000 appuser RUN useradd -m -u 1000 appuser
# 创建 Nginx 运行目录并设置权限 # 设置目录权限(Nginx 以 root 运行,后端应用以 appuser 运行)
RUN mkdir -p /var/log/nginx /var/lib/nginx /var/cache/nginx /var/run && \ RUN mkdir -p /var/log/nginx /var/lib/nginx /var/cache/nginx /var/run && \
chown -R appuser:appuser /app && \ chown -R appuser:appuser /app && \
chown -R appuser:appuser /usr/share/nginx/html && \ chown -R root:root /usr/share/nginx/html && \
chown -R appuser:appuser /var/log/nginx && \ chown -R root:root /var/log/nginx && \
chown -R appuser:appuser /var/lib/nginx && \ chown -R root:root /var/lib/nginx && \
chown -R appuser:appuser /var/cache/nginx && \ chown -R root:root /var/cache/nginx && \
chown -R appuser:appuser /etc/nginx && \ chown -R root:root /etc/nginx && \
chown -R appuser:appuser /var/run chown -R root:root /var/run
USER appuser # 保持 root 用户(Nginx 需要 root 权限绑定 80 端口)
# USER appuser
# 暴露端口 # 暴露端口
EXPOSE 80 EXPOSE 80
+1 -1
View File
@@ -1,4 +1,4 @@
user appuser; user root;
worker_processes auto; worker_processes auto;
error_log /var/log/nginx/error.log warn; error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid; pid /var/run/nginx.pid;
+2 -2
View File
@@ -17,9 +17,9 @@ cleanup() {
# 注册信号处理 # 注册信号处理
trap cleanup SIGTERM SIGINT trap cleanup SIGTERM SIGINT
# 启动后端服务(后台运行) # 启动后端服务(以 appuser 用户运行,后台运行)
echo "启动后端服务..." echo "启动后端服务..."
java -jar /app/app.jar --spring.profiles.active=${SPRING_PROFILES_ACTIVE:-prod} & su appuser -c "cd /app && java -jar /app/app.jar --spring.profiles.active=${SPRING_PROFILES_ACTIVE:-prod}" &
BACKEND_PID=$! BACKEND_PID=$!
# 等待后端服务启动 # 等待后端服务启动