如何保障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做简单的监控,不仅能自动重启服务,还能及时通知你(可选):
- 安装monit:
sudo apt-get install monit - 配置监控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
- 配置监控你的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
- 启动并启用monit:
sudo systemctl enable monit sudo systemctl start monit
按这些步骤操作后,你的Nginx和应用容器应该能稳定运行了。如果还是有问题,再仔细看日志排查是不是应用本身的bug导致的崩溃。
内容的提问来源于stack exchange,提问作者Matias
相关产品推荐
相关产品推荐

