You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保障Dokku部署的Nginx与LXC服务持续运行?

解决Dokku部署后Nginx与应用容器意外停止的方案

嘿,我碰到过不少类似的情况,尤其是在2GB内存的小服务器上,Dokku+Nginx+应用很容易因为内存吃紧或者进程意外退出挂掉。给你一套靠谱的解决步骤,一步步来:

先搞清楚为啥停止——排查根源

首先得确定是啥原因导致的服务停止,最常见的就是内存不足被系统OOM Killer干掉,先查日志确认:

  • 查看Nginx的错误日志:sudo tail -f /var/log/nginx/error.log
  • 查看Dokku应用的容器日志:dokku logs <你的应用名称>
  • 检查系统内存使用和OOM记录:
    free -h # 查看当前内存/swap使用情况
    dmesg | grep -i oom # 查找系统是否因内存不足杀死进程
    

如果日志里出现Out of memory或者OOM Killer相关的记录,那基本就是内存的锅,接下来针对性解决。

1. 给服务器加Swap缓解内存压力

2GB内存对于Dokku+应用来说确实有点紧张,加个Swap分区能大幅降低OOM的概率:

# 创建4GB的Swap文件(可根据服务器磁盘大小调整为2-4GB)
sudo fallocate -l 4G /swapfile
# 设置权限避免其他用户访问
sudo chmod 600 /swapfile
# 格式化Swap文件
sudo mkswap /swapfile
# 启用Swap
sudo swapon /swapfile
# 设置开机自动挂载Swap
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

2. 让服务挂了自动重启——兜底保障

不管是啥原因导致的停止,让系统自动把服务拉起来是最基础的保障:

给Nginx加自动重启

Ubuntu 16.04用systemd管理服务,修改Nginx的重启策略:

sudo systemctl edit nginx

在打开的编辑器里添加:

[Service]
Restart=always
RestartSec=3 # 服务挂掉后3秒自动重启

保存后重新加载配置并重启Nginx:

sudo systemctl daemon-reload
sudo systemctl restart nginx

给Dokku应用容器加自动重启

通过Dokku的docker-options设置容器的重启策略,确保容器退出后自动重启:

# 给应用的运行和部署阶段都加上always重启策略
dokku docker-options:add <你的应用名称> run "--restart=always"
dokku docker-options:add <你的应用名称> deploy "--restart=always"

3. 降低服务内存占用——从根源减少压力

优化Nginx和Dokku的配置,减少不必要的内存消耗:

优化Nginx配置

编辑/etc/nginx/nginx.conf,调整以下参数(单核服务器建议设小一点):

worker_processes 1; # 单核服务器设1,多核设为CPU核心数
worker_connections 1024; # 减少并发连接数,降低内存占用
keepalive_timeout 60; # 适当缩短连接超时时间

修改完重启Nginx:sudo systemctl restart nginx

清理无用的Docker资源

Dokku会留下旧的容器、镜像,占用内存和磁盘,定期清理:

# 使用Dokku自带的清理命令
dokku cleanup:run
# 或者用Docker的清理命令,删除无用的容器、镜像、卷
docker system prune -f

4. 设置监控——提前发现问题

用monit做简单的监控,不仅能自动重启服务,还能及时通知你(可选):

  1. 安装monit:sudo apt-get install monit
  2. 配置监控Nginx:创建/etc/monit/conf.d/nginx文件,内容如下:
check process nginx with pidfile /var/run/nginx.pid
  start program = "/usr/sbin/service nginx start"
  stop program = "/usr/sbin/service nginx stop"
  if failed host localhost port 80 protocol http then restart
  if 5 restarts within 5 cycles then timeout
  1. 配置监控你的Dokku应用:创建/etc/monit/conf.d/<你的应用名称>文件,内容如下(替换<你的应用名称>和<应用端口>):
check process <你的应用名称> with pidfile /var/run/docker/<你的应用名称>.pid
  start program = "dokku ps:start <你的应用名称>"
  stop program = "dokku ps:stop <你的应用名称>"
  if failed host localhost port <应用端口> protocol http then restart
  1. 启动并启用monit:
sudo systemctl enable monit
sudo systemctl start monit

按这些步骤操作后,你的Nginx和应用容器应该能稳定运行了。如果还是有问题,再仔细看日志排查是不是应用本身的bug导致的崩溃。

内容的提问来源于stack exchange,提问作者Matias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:24:21