如何修复Django AWS EC2中Gunicorn ExecStart/ExecStop缺失错误及Route53配置问题?
解决AWS Route53指向EC2 Django应用时的Gunicorn服务报错问题
咱们先从你遇到的核心报错入手:gunicorn.service: Service lacks both ExecStart= and ExecStop= setting. Refusing. 这说明你的systemd服务配置文件里缺少了启动和停止Gunicorn的关键指令,导致服务无法正常初始化。下面一步步帮你解决:
1. 修复Gunicorn Systemd服务配置
首先找到你的gunicorn.service文件(通常在/etc/systemd/system/目录下),替换成包含完整启动/停止指令的配置。下面是一个适配Django项目的示例配置,记得替换成你自己的路径和用户名:
[Unit] Description=gunicorn daemon for Django app After=network.target [Service] User=ubuntu # 替换成你的EC2实例用户名(比如ubuntu/ec2-user) Group=www-data WorkingDirectory=/home/ubuntu/your-django-project # 替换成你的Django项目根目录 ExecStart=/home/ubuntu/your-venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/your-django-project/your-project.sock your-project.wsgi:application ExecStop=/bin/kill -TERM $MAINPID ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target
配置说明:
WorkingDirectory:指定Django项目的根目录,确保Gunicorn能找到项目文件ExecStart:通过虚拟环境启动Gunicorn,绑定到unix套接字(比直接绑定端口更安全高效),最后指向你的Django项目的wsgi.py模块ExecStop:定义停止Gunicorn服务的指令
配置完成后,重新加载systemd并启动服务:
sudo systemctl daemon-reload sudo systemctl start gunicorn sudo systemctl status gunicorn
如果服务状态显示active (running),再设置开机自启:
sudo systemctl enable gunicorn
2. 验证Django项目基础配置
检查settings.py里的ALLOWED_HOSTS,必须包含你的Route53域名和EC2公网IP,否则Django会拒绝请求:
ALLOWED_HOSTS = ['your-domain.com', '1.2.3.4'] # 替换成你的域名和EC2公网IP
同时可以先直接启动Django测试服务器验证项目本身没问题:
source /home/ubuntu/your-venv/bin/activate python manage.py runserver 0.0.0.0:8000
此时用EC2公网IP:8000访问,确认能正常打开Django页面。
3. 确认Nginx配置匹配Gunicorn
虽然你说Nginx配置测试成功,但要确保它正确指向Gunicorn的套接字(或端口)。示例Nginx配置如下:
server { listen 80; server_name your-domain.com www.your-domain.com; # 处理静态文件 location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/ubuntu/your-django-project; } # 转发动态请求到Gunicorn location / { include proxy_params; proxy_pass http://unix:/home/ubuntu/your-django-project/your-project.sock; # 如果Gunicorn绑定的是端口,这里改成 proxy_pass http://127.0.0.1:8000; } }
配置完成后重新加载Nginx:
sudo nginx -t && sudo systemctl reload nginx
4. 检查AWS网络与Route53配置
- EC2安全组:确保开放了80端口(HTTP),允许所有IP(
0.0.0.0/0)或指定IP访问 - Route53记录集:确认A记录的
值是EC2的公网IPv4地址,TTL可以设为300(5分钟),等待解析生效后用nslookup your-domain.com验证解析是否正确
5. 排查后续可能问题
如果Gunicorn启动失败,查看详细日志定位原因:
sudo journalctl -u gunicorn
常见问题包括:虚拟环境路径错误、套接字文件权限不足(确保www-data用户能访问)、Django依赖未安装完全等。
内容的提问来源于stack exchange,提问作者user1426442
相关产品推荐
相关产品推荐

