Ubuntu环境下Django+Gunicorn+Nginx部署实战指南
本文详细记录在Ubuntu 16.04环境下,使用Python 3.6、Django 1.11、Gunicorn 19.7.1及Nginx 1.10.3进行Web应用部署的完整流程。内容涵盖Django项目结构初始化、setting.py关键配置(DEBUG、ALLOWED_HOSTS、STATIC_ROOT)、静态文件收集,Gunicorn进程管理器的启动与配置,以及Nginx反向代理与静态文件服务的设置。同时提供常见错误排查方案,如端口不一致、静态文件404/403错误的解决方法,帮助开发者快速搭建生产环境。
部署环境说明
本文基于以下环境版本进行说明:操作系统为Ubuntu 16.04,Python版本为3.6,Django版本为1.11,Gunicorn版本为19.7.1,Nginx版本为1.10.3。
写在前面
在部署过程中,我们常会遇到各种阻碍。当感到困惑时,建议跳出局部细节,从整体架构视角审视问题。无论系统多么复杂,其设计逻辑始终源于人类思维,因此透过现象看本质至关重要。例如,面对网页无法访问或持续返回404错误时,直接搜索往往难以获得针对性答案。建议将问题细化:网页打不开通常意味着80端口无法访问,此时应检查服务器防火墙是否禁用了相关端口,或云服务商的安全组设置是否关闭了端口。可以尝试ping测试服务器在线状态,或检查代理服务器是否正确监听了目标端口。
此外,绝大多数技术难题都有前人解决过的案例。只要用心搜索,通常能找到解决方案。
Django项目配置
关于Django
首先,确保在开发环境下项目能够正常访问。
执行python manager.py startproject project命令后,项目目录结构大致如下:
project/
--project/
--__init__.py
--setting.py
--urls.py
--wsgi.py
--templates/
--your app/
--manage.py
接下来需要修改project/setting.py配置文件。
主要需要调整以下几个关键点:
1. 将DEBUG设置为False。只有关闭调试模式,Nginx才能正确查找静态文件。
2. 在ALLOWED_HOSTS中添加你的域名(支持多个,用逗号分隔)以及服务器IP。为了本地调试方便,我还添加了127.0.0.1。
3. 设置STATIC_ROOT,建议直接设为os.path.join(BASE_DIR, 'static/'),即将静态文件文件夹放置在manage.py所在的根目录下。
4. 执行python manager.py collectstatic命令,这会将所有静态文件收集到第三步设置的目录中。
执行完上述第四步后,目录结构应包含新增的static文件夹,具体结构如下:
project/
--project/
--__init__.py
--setting.py
--urls.py
--wsgi.py
--templates/
--your app/
--manage.py
--static/
--auth/
--your app/
--css/
--js/
--images/
Gunicorn服务配置
关于Gunicorn
初次使用时,可以先尝试直接运行。进入project根目录后,执行以下命令:
gunicorn -w 3 -b 127.0.0.1:8080 project.wsgi:application
若无意外,服务应当能够正常启动。
关于project.wsgi:application参数的解释:前半部分project.wsgi很容易理解,即调用project目录下的wsgi.py文件;而后面的application,起初我误以为需要替换为具体的app名称,后来发现这实际上是wsgi.py文件中定义的变量名,因此是固定的,无需修改。
测试运行无误后,可以直接在根目录下创建gunicorn.conf.py配置文件。
通过该文件配置启动参数,后续运行即可直接使用:
gunicorn -c gunicorn.conf.py project.wsgi:appliction
这样可以避免每次在命令行输入冗长的启动参数。
我在Docker环境下运行,使用nohup执行时遇到了import error,推测是环境变量未正确设置,目前尚未解决此问题,因此暂时仅使用&符号在后台运行。
Nginx反向代理与静态文件配置
关于Nginx
首先简述我对Django、Gunicorn和Nginx三者协作关系的理解。访问网站本质上是访问网络中某台计算机特定路径下的文件。Django的主要作用是生成这些文件。以餐馆为例,Django如同厨师,负责制作菜品。在规模较小时(如路边摊),客人少,厨师可直接询问需求并制作,这对应Django自带的runserver功能。当规模扩大(如普通餐馆),顾客增多,厨师忙于做菜无暇接待,此时需要服务员。服务员记录订单、传达给厨房并上菜,Gunicorn即扮演服务员角色。当规模极大(每分钟数百人访问),仅靠服务员无法处理所有请求,且空间有限,因此在餐馆门口安排咨客有序引导客人或提前点菜以提高效率,Nginx即扮演咨客角色。
首先试运行Nginx,启动Nginx服务后,访问本地应能看到Nginx的欢迎页面。
由于当前配置仅涉及同步worker,因此只需配置监听端口和静态文件地址即可。
server{
listen 80;监听的端口
server_name 127.0.0.1;
server_name 111.111.111.111;
server_name your_www;
#当请求这些server name的时候,nginx才会做反向代理,0.0.0.0是指全部
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
# location 顾名思义,定位,就是当访问 / 的时候,nginx会将请求转给本地的8080端口,而后面的设置都是一些基本的配置,可以直接用
location /static {
alias /home/project/static;
}
# 这个就是配置静态文件的地方,要用绝对地址,对应最开始的目录形式,假设project就在/home下面,那么这样配置就可以的了,还有个前提是,你在开发的时候,采取了django的建议,每个app的静态文件都用多了一层app_name的文件夹来包住。
}
在配置静态文件时,alias /path/to/static表示直接在该地址下查找,而root /path/to/static表示在/path/to/static/static目录下查找,即root配置会自动追加一个static子目录。
修改conf文件后,可执行nginx -t进行检查,确认无误后:
执行service nginx restart,使配置生效。
确认Gunicorn已运行,此时访问本地应能看到你的网页。
常见错误排查
错误分析
- 若仍看到Nginx欢迎页,请检查Gunicorn监听端口与Nginx转发端口是否一致;检查是否启动了多个Gunicorn实例;如果Gunicorn未开启reload功能,修改Django代码后需手动重启Gunicorn。
- 若显示网站内容但静态文件返回404,说明静态文件路径配置错误;若静态文件返回403,则是权限问题。需在Nginx配置头部修改user信息为你的用户,且该用户需具备Nginx权限。最简单的方法是将用户加入nginx组,若需立即见效,可直接改为user root。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













