uwsgi 启动 django 服务
使用uWSGI来启动Django服务是一个常见的部署选择。以下是基本步骤,帮助你完成这个过程:
1. 安装uWSGI
首先确保你的环境中已经安装了uWSGI。你可以通过pip来安装它:
pip install uwsgi
注意:在某些系统上,可能需要通过系统的包管理器来安装uWSGI(比如在Ubuntu上使用apt-get
),或者根据你的Python版本和环境需求构建uWSGI。
2. 配置Django项目
确保你的Django项目配置正确,并且可以在开发服务器上正常运行。特别地,确认你的settings.py
文件中ALLOWED_HOSTS
设置包含了将要部署的服务的域名或IP地址。
3. 创建uWSGI配置文件
为你的Django项目创建一个uWSGI配置文件。这可以是一个.ini
文件、XML文件等,但最常见的是使用.ini
格式。下面是一个简单的例子,假设你的项目名为myproject
,并且wsgi.py
位于项目的根目录下:
[uwsgi]
chdir = /path/to/your/myproject/
module = myproject.wsgi:applicationmaster = true
processes = 5socket = myproject.sock
chmod-socket = 660
vacuum = truedie-on-term = true
这里:
chdir
指向你的Django项目目录。module
指定Django的WSGI入口点。processes
定义了工作进程的数量。socket
指定了uWSGI将使用的Unix套接字文件名(对于网络套接字,可以使用http=
或socket=
参数并提供:端口号
)。chmod-socket
设置生成的套接字文件权限。vacuum
在服务停止时自动清除套接字文件。
4. 使用uWSGI启动Django服务
有了上述配置文件后,你可以使用以下命令来启动uWSGI服务器:
uwsgi --ini myproject_uwsgi.ini
这里的myproject_uwsgi.ini
应替换为你实际的uWSGI配置文件名。
5. 配合Nginx或其他Web服务器使用
通常情况下,你会希望使用Nginx或者其他Web服务器作为前端代理静态文件并转发请求到uWSGI应用服务器。为此,你需要在Nginx配置中添加相应的location块来处理Django应用的请求,并指向正确的uWSGI socket。
以上是基本的指导步骤。根据具体的生产环境和需求,你可能还需要调整更多的uWSGI和Nginx配置选项。
看一个实例:
构建一个 uwsgi.ini 文件:
[uwsgi]
http = :8000
chdir = /home/ymk/ymk_django_test/django_rq_model_test
module = django_rq_model_test.wsgiqueue=30
buffer-size = 65536master = true
processes = 4
threads = 2
pidfile = /tmp/uwsgi.pid
log-maxsize = 50000000
py-call-uwsgi-fork-hooks = true
max-fd = 65535
注意,该文件必须和 manage.py 在同级目录。
让我们逐行解析这个配置文件:
[uwsgi]
这是配置文件的开始部分,表示以下的所有配置项都是针对 uWSGI 的。
http = :8088
这行配置指定了 uWSGI 监听的 HTTP 端口为 8088。这意味着你的应用程序可以通过 http://localhost:8088
访问。
chdir = /label-studio/label_studio
这行配置指定了 uWSGI 在启动时切换到的工作目录。在这个例子中,工作目录被设置为 /label-studio/label_studio
。确保你的 Django 项目位于这个目录下,或者根据实际情况调整路径。
module = django_rq_model_test.wsgi
这行配置指定了 Django 项目的 WSGI 入口点。在 Django 中,通常会在项目的根目录下有一个 wsgi.py
文件,它定义了如何将请求传递给 Django 应用程序。这里的 django_rq_model_test.wsgi
表示 uWSGI 将加载 django_rq_model_test
应用中的 wsgi.py
文件作为入口点。简单的来说, module 参数,就是用来告诉 uWSGI ,wsgi.py 文件的位置在哪。
queue=30
这行配置设置了请求队列的最大长度为 30。当 uWSGI 接收到的请求超过当前处理能力时,这些请求会被放入队列等待处理。如果队列已满,新的请求将被拒绝。
buffer-size = 65536
这行配置设置了缓冲区大小为 65536 字节(64KB)。缓冲区用于存储从客户端接收到的数据和发送到客户端的数据。
master = true
这行配置启用了主进程模式。在主进程模式下,uWSGI 会创建一个主进程来管理其他工作进程。主进程负责监控工作进程的状态,并在工作进程崩溃时重新启动它们。
processes = 4
这行配置指定了 uWSGI 创建的工作进程数量为 4。每个工作进程都可以独立地处理请求,从而提高应用程序的并发处理能力。
threads = 2
这行配置指定了每个工作进程中创建的线程数量为 2。多线程可以进一步提高应用程序的并发处理能力,特别是在处理 I/O 密集型任务时。
pidfile = /tmp/uwsgi.pid
这行配置指定了 uWSGI 进程 ID 文件的路径为 /tmp/uwsgi.pid
。进程 ID 文件包含了 uWSGI 主进程的 PID,可以用于管理和控制 uWSGI 服务。
log-maxsize = 500000000
这行配置设置了日志文件的最大大小为 500MB。当日志文件达到这个大小时,uWSGI 会自动进行日志轮转,以防止日志文件无限增长。
py-call-uwsgi-fork-hooks = true
这行配置启用了 Python 的 fork 钩子。在某些情况下,Python 的垃圾回收器可能会导致问题,启用这个选项可以帮助解决这些问题。
daemonize = /label-studio/logs/uwsgi.log
这行配置指定了 uWSGI 以守护进程模式运行,并将日志输出到指定的日志文件 /label-studio/logs/uwsgi.log
。
max-fd = 65535
这行配置设置了 uWSGI 可以打开的最大文件描述符数量为 65535。文件描述符用于表示打开的文件、套接字等资源。
总结
这个 uwsgi.ini
文件配置了一个高性能的 uWSGI 服务器,用于部署 Django 应用程序。通过合理的配置,它可以有效地处理高并发请求,并提供稳定的性能。在实际使用中,你可能需要根据具体的应用场景和系统资源对这些配置进行调整。
然后,就可以启动服务了:
(myvenv) ymk@ubuntu:~/ymk_django_test/django_rq_model_test$ myvenv/bin/uwsgi uwsgi.ini
[uWSGI] getting INI configuration from uwsgi.ini
*** Starting uWSGI 2.0.30 (64bit) on [Thu Aug 7 00:52:32 2025] ***
compiled with version: 9.4.0 on 07 August 2025 06:54:25
os: Linux-5.15.0-139-generic #149~20.04.1-Ubuntu SMP Wed Apr 16 08:29:56 UTC 2025
nodename: ubuntu
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 2
current working directory: /home/ymk/ymk_django_test/django_rq_model_test
writing pidfile to /tmp/uwsgi.pid
detected binary path: /home/ymk/ymk_django_test/django_rq_model_test/myvenv/bin/uwsgi
chdir() to /home/ymk/ymk_django_test/django_rq_model_test
your processes number limit is 15115
your memory page size is 4096 bytes
detected max file descriptor number: 65535
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
*** Queue subsystem initialized: 0MB preallocated ***
uWSGI http bound on :8000 fd 7
uwsgi socket 0 bound to TCP address 127.0.0.1:32859 (port auto-assigned) fd 6
Python version: 3.8.10 (default, Dec 6 2024, 01:19:56) [GCC 9.4.0]
Python main interpreter initialized at 0x55e10d2ef800
python threads support enabled
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 1031270 bytes (1007 KB) for 8 cores
*** Operational MODE: preforking+threaded ***
INFO ✅ uWSGI detected. uwsgi.worker_id() = 0
INFO SCHEDULER_JOBS add success
INFO ✅ APScheduler started in uWSGI worker 0 (worker_id=0)
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x55e10d2ef800 pid: 17109 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 17109)
spawned uWSGI worker 1 (pid: 17112, cores: 2)
spawned uWSGI worker 2 (pid: 17113, cores: 2)
spawned uWSGI worker 3 (pid: 17115, cores: 2)
spawned uWSGI worker 4 (pid: 17116, cores: 2)
spawned uWSGI http 1 (pid: 17118)
注意,因为我是用的 pip install --no-cache-dir uwsgi 来下载的 uwsgi ,因此这里的 uwsgi 文件的位置就是在虚拟环境的 bin 目录,如果用 apt 下载,那么他的位置就在 /bin ,这也导致了他的调用方式,略有不同。