无虚拟环境下基于Nginx+Gunicorn部署Django的Gunicorn配置求助
无虚拟环境适配的Gunicorn完整生产配置流程(Ubuntu 18.04 环境)
适配前提:Django项目存放路径为
/home/django_project、全程不使用Python虚拟环境、已可通过手动执行gunicorn --bind 0.0.0.0:8000 myproject.wsgi正常拉起项目服务
前置校准(无虚拟环境场景必做)
这部分是常规虚拟环境教程中通常缺失的关键校验步骤:
- 执行
which gunicorn,记录返回的全局gunicorn可执行文件绝对路径(常见路径为/usr/bin/gunicorn或/usr/local/bin/gunicorn,后续系统服务配置必须使用该绝对路径,不能直接写相对的gunicorn命令,否则系统启动时会找不到程序) - 调整项目目录权限,避免Web运行用户读取文件被拒绝:
- 执行
sudo chown -R www-data:www-data /home/django_project,将项目目录属主设为Nginx、Gunicorn统一使用的运行用户 - 执行
sudo chmod -R 755 /home/django_project,保证程序可以正常读取项目代码、模板、静态文件内容
- 执行
配置Gunicorn常驻系统服务
手动执行gunicorn启动的服务会在终端关闭、服务器重启时中断,需要通过systemd配置实现开机自启、后台常驻:
- 新建systemd服务文件,执行
sudo nano /etc/systemd/system/gunicorn.service - 将以下配置内容写入文件,注意将ExecStart行的gunicorn路径替换为之前
which gunicorn查到的实际路径:
[Unit] Description=Gunicorn Django 服务 After=network.target [Service] User=www-data Group=www-data # 指定项目根目录,和实际项目路径保持一致 WorkingDirectory=/home/django_project # 启动参数:3个worker进程,通过本地unix socket和Nginx通信,避免对外暴露TCP端口 ExecStart=/usr/bin/gunicorn --workers 3 --bind unix:/home/django_project/gunicorn.sock myproject.wsgi:application [Install] WantedBy=multi-user.target
- 保存退出编辑器后,依次执行以下命令完成服务注册与启动:
sudo systemctl daemon-reload重载系统服务配置sudo systemctl start gunicorn立即启动Gunicorn服务sudo systemctl enable gunicorn设置服务器开机时自动启动Gunicornsudo systemctl status gunicorn检查服务运行状态,若输出中出现active (running)字样,说明服务已正常常驻运行
Nginx 反向代理对接Gunicorn
完成Gunicorn常驻配置后,需要通过Nginx把对外80端口的请求转发到Gunicorn的本地socket上:
- 新建Nginx站点配置文件,执行
sudo nano /etc/nginx/sites-available/myproject - 写入以下配置内容,将
server_name字段替换为自己的站点域名或服务器公网IP:
server { listen 80; server_name 你的站点域名或公网IP; # 静态文件映射路径,需和Django配置文件中STATIC_ROOT的路径保持一致 location /static/ { alias /home/django_project/static/; } # 媒体文件上传路径映射 location /media/ { alias /home/django_project/media/; } # 动态请求转发到Gunicorn的本地socket location / { proxy_pass http://unix:/home/django_project/gunicorn.sock; 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; } }
- 依次执行以下命令完成Nginx配置启用:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/将配置文件软链到Nginx启用目录sudo rm /etc/nginx/sites-enabled/default删除Nginx默认的测试站点,避免域名冲突sudo nginx -t校验Nginx配置语法,看到syntax is ok、test is successful的提示即可继续sudo systemctl restart nginx重启Nginx使配置生效
无虚拟环境部署的专属注意事项
- 所有Python依赖(Django、Gunicorn、PostgreSQL驱动等)均通过全局pip安装,不要随意修改系统Python自带的内置依赖,避免影响系统本身的功能
- 后续更新Django项目代码、升级依赖版本时,不需要激活任何环境,直接拉取代码后执行全局pip安装对应依赖,再运行
sudo systemctl restart gunicorn即可使更新生效 - 手动测试用的
gunicorn --bind 0.0.0.0:8000命令仅用于功能验证,正式生产环境不要将8000端口直接对外暴露,所有外部请求统一走Nginx反向代理转发,减少安全风险 - 若服务器上仅运行当前这一个Django项目,无虚拟环境的部署方式完全可以稳定支撑中高访问量;若后续需要在同一台服务器上运行多个Python项目,再为每个项目单独配置虚拟环境隔离即可
内容的提问来源于stack exchange,提问作者Sapna Sharma
相关产品推荐
相关产品推荐

