使用Nginx与uWSGI在CentOS 7上部署Django应用
环境准备与组件安装
为了在生产环境中高效运行Django项目,选择Nginx作为反向代理服务器,配合uWSGI应用服务器是一种常见且性能优越的方案。本文将介绍如何在CentOS 7系统中完成该架构的搭建。
首先安装必要的软件包:
# 安装 Python 的 uWSGI 支持
pip install uwsgi
# 启用 EPEL 软件源以获取 Nginx
yum install -y epel-release
# 安装 Nginx 及其相关组件
yum install -y nginx
基础功能验证
在集成部署前,先通过一个简单脚本测试uWSGI是否正常工作。
# 创建 test.py 文件
def application(environment, response_start):
response_start('200 OK', [('Content-Type', 'text/html')])
return [b'Hello from uWSGI']
启动服务并进行访问测试:
uwsgi --http :80 --wsgi-file test.py
若浏览器或Postman请求返回"Hello from uWSGI",说明uWSGI已可独立处理HTTP请求。
Django项目接入测试
创建一个新的Django项目用于部署测试:
django-admin startproject myproject /home/myproject
修改settings.py中的ALLOWED_HOSTS,加入服务器IP地址:
ALLOWED_HOSTS = ['your_server_ip', 'localhost']
使用以下命令直接运行项目:
uwsgi --http :80 --chdir /home/myproject --module myproject.wsgi
成功访问Django默认欢迎页(显示"It works!")即表示项目能被uWSGI正确加载。
配置uWSGI参数文件
为便于管理,使用INI格式的配置文件替代命令行参数。
[uwsgi]
# 项目根目录
chdir = /home/myproject
# WSGI模块路径
module = myproject.wsgi:application
# 主进程控制
master = true
# 工作进程数
processes = 4
# 网络监听地址(TCP端口方式)
socket = 127.0.0.1:8001
# 权限设置(若需Socket文件方式)
chmod-socket = 666
chown-socket = nginx:nginx
# 自动清理资源
vacuum = true
# 启用多线程支持
enable-threads = true
将上述内容保存为/etc/uwsgi/ini/myproject.ini。
Nginx反向代理配置
编辑主配置文件/etc/nginx/nginx.conf,在http块内添加upstream定义:
upstream django_backend {
server 127.0.0.1:8001;
}
修改默认server块,实现静态资源分离与动态请求转发:
server {
listen 80;
server_name _;
location /static/ {
alias /home/myproject/static/;
expires 30d;
}
location / {
include uwsgi_params;
uwsgi_pass django_backend;
uwsgi_read_timeout 30;
uwsgi_send_timeout 30;
}
}
确保静态文件收集已完成:
cd /home/myproject
python manage.py collectstatic
使用Systemd管理系统服务
创建统一的服务管理单元,实现uWSGI守护进程化运行。
mkdir -p /etc/uwsgi/ini
编写systemd服务文件/etc/systemd/system/uwsgi.service:
[Unit]
Description=uWSGI Emperor Service
After=network.target syslog.target
[Service]
ExecStart=/usr/bin/uwsgi --emperor /etc/uwsgi/ini
Restart=always
User=root
Group=nginx
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
[Install]
WantedBy=multi-user.target
启用并启动服务:
systemctl daemon-reexec
systemctl enable uwsgi
systemctl start uwsgi
systemctl status uwsgi
同时启动Nginx:
systemctl enable nginx
systemctl start nginx
故障排查建议
- 检查SELinux状态,必要时临时禁用:
setenforce 0 - 确认防火墙放行80端口:
firewall-cmd --permanent --add-service=http - 查看日志定位问题:
/var/log/nginx/error.log和journalctl -u uwsgi