1.服务器选择原因:
uWSGI web服务器+Django其实也可以满足web服务器的要求,那么再接上nginx web服务器的原因?
首先Nginx服务器处理静态网页的能力特别强,起码比uWSGI web服务器好。所以可以两个服务器结合,做好动静服务的分离。即是Nginx提供静态服务,uWSGI服务器+Django提供动态服务,这样可以大大的提高响应效率。
2.安装配置uWSGI服务:
2.1安装uWSGI:
pip install uWSGI
2.2 终端命令启动uwsgi服务
Django应用可以单独跑起来(Django也带有web服务功能,但是比较差,可以验证开发)
Django 起服务的命令如下:python3 manage.py runserver 0.0.0.0:9000,如果这个可以通过浏览器验证通过,说明自己开发服务端程序没问题。
在之前验证通过的前提下,在Django项目目录中,执行一下命令,验证uwsgi服务器。
uwsgi --http 0.0.0.0:9000 --file form_demo/wsgi.py --static-map=/static=static
--file form_demo/wsgi.py: Django的form_demo项目名称,wsgi.py指定协议的名称即是wsgi协议。
--static-map=/static=static: 静态文件,可以不写。在浏览器刷新时会找不到。
以上是命令行启动,实际项目中更多的使用配置文件启动。
2.3使用配置文件启动uWSGI [ini 格式]
如下文件uwsgi.ini
[uwsgi]
#项目目录,根据自己项目来定
chdir=/data/Project/python/django_project/form_demo
#启动uwsgi的用户名和用户组
uid=root
gid=root
#指定项目的application
moudle=for_demo.wsgi
#指定sock的文件路径,相对路径有时会出现无法创建文件的情况.
socket=/data/Project/python/django_project/script/uwsgi.sock
#http = :8080 # 如果需要同时提供HTTP服务(如直接对外),此处配合nginx,未用
#启用主进程
master=true
#进程个数
worker=2
#每个进程的线程数
threads=3
#记录进程ID文件
pidfile=/data/Project/python/django_project/script/uwsgi.pid
#当uwsgi服务停止的时候,是否自动删除socket和pid
vacuum=true
#启用
thunder-lock
功能,当设置为true
时,uWSGI 会使用全局文件锁来处理资源竞争问题。你也可以将其设置为false
来禁用该功能thunder-lock = true
#允许多线程(需配合'threads'使用)
enable-threads = true
#请求超时时间(秒),超时自动重启进程
harakiri = 30
#
post-buffering
设置为 65536 字节(即 64KB),意味着 uWSGI 会将 POST 请求数据# 缓冲到 64KB 后再传递给应用程序,当post-buffering
设置为 0 时,uWSGI 会采用流# 式处理的方式,将客户端发送的 POST 请求数据逐块传递给应用程序,而不会进行缓冲post_buffering = 4096
# 日志配置
daemonize = /data/Project/python/django_project/script/uwsgi.log # 后台运行并输出日志
#logto = /var/log/uwsgi.log # 等同于 daemonize(二者选一)
#disable-logging = true # 关闭请求日志(仅记录错误)#下述配置将 URL 中以
/static
开头的请求映射到服务器文件系统中的/path/to/#static/files
目录。例如,当客户端请求http://example.com/static/#style.css
时,uWSGI 会尝试从/path/to/static/files/style.css
文件中读取#内容并返回给客户端#static-map = /static=/path/to/static/files #此处暂时不用
# 虚拟环境(如果使用)
#virtualenv = /path/to/venv # (本项目Python虚拟环境路径,未使用)
-
socket
指定与Web服务器(如Nginx)通信的地址。可以是端口(如:8000
)或Unix Socket文件(如/tmp/uwsgi.sock
)。-
使用Nginx时通常选择Unix Socket(性能更好)。
-
直接对外提供HTTP服务时用
http
代替socket
。
-
-
module
指定WSGI入口,例如Django项目的myapp.wsgi:application
。 -
virtualenv
/home
指定Python虚拟环境路径,确保uWSGI使用项目依赖。 -
processes
和threads
根据服务器CPU核心数调整进程和线程数(如processes = 2 * CPU核心数
)。 -
master
启用主进程管理子进程,提高稳定性。 -
harakiri
防止请求阻塞,超时自动终止并重启进程。 -
vacuum
退出时自动清理临时文件(避免残留Socket文件导致重启失败)。
2.4生产环境建议
-
使用 Nginx 反向代理到uWSGI的Socket。
-
用 Supervisor 或 systemd 管理uWSGI进程。
-
日志分割:使用
logrotate
或daemonize
结合日志文件路径
可以把uwsgi服务的配置文件和一些服务产生的log信息等放到一个统一目录管理。
我这里是创建一个script文件夹和Django项目同级目录。
常用命令:
uwsgi --ini uwsgi.ini通过配置文件启动wsgi服务
ps -ef | grep -i uwsgi 查看uwsgi服务是否启动?
uwsgi --stop uwsgi.pid 关闭uwsgi服务。
以上命令在创建的script文件夹下执行即可
3.安装配置Nginx
3.1安装Nginx
sudo apt install nginx
也可以用yum源管理安装nginx。
3.2Nginx配置:
server{
#监听端口