当前位置:首页 > 技术 > 正文内容

使用Nginx与uWSGI在CentOS 7上部署Django应用

访客 技术 2026年6月5日 1

环境准备与组件安装

为了在生产环境中高效运行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.logjournalctl -u uwsgi

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。