一、开发配置版本
Liunx Version: CentOS 7.5 64位 Python Version: 3.6.9 Django Version: 2.2.9 Nginx Version: nginx/1.13.7
前言
众所周知 uWSGI + django + nginx 为常用的后端项目配置项,我们来简单理解一下。
uWSGI: 是一个自有uwsgi协议,wsgi协议以及http服务协议的Web服务器。Nginx中HttpUwsgiModule的作用就是与uWSGI服务器进行交换。
Django: 项目是一个Python定制Web框架,它源自一个在线新闻 Web 站点,于 2005年以开源的形式被释放出来。 Django框架的核心组件有:用于创建模型的对象关系映射为最终用户设计的完美管理界面一流的 URL 设计设计者友好的模板语言缓存系统。
Nginx: 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器, 其特点是占有内存少,并发能力强, 稳定性高等优势。
Gunicorn: Gunicorn是?个WSGI HTTP Server,是针对Python的、在Unix系统上运?的、?来解析HTTP请求的?关服务。它的特点是:能和?多数的Python web框架兼容
应用场景:
基于WSGI使用时只能支持不足100人的访问就会导致服务宕机, 从而通过高性能Nginx通过负载均衡对请求进行分流转发到对应的uWSGI服务, 因为UWSGI本身也是可多线程多进程进行请求。 从而让我们整个服务完成一个高性能的运转。
为什么会放弃uWSGI 使用 gunicorn 的原因?
本身在我们的项目中存在websocket 即时消息提醒。 使用uWSGI 进行配置时http请求与wss请求阻塞导致服务挂起状态不做请求处理。 所以最終选用的 gunicorn 中的 gevent 模式, 完美解决卡顿服务挂起的问题。
本文不過多讲解, 带大家看看各自的配置使用方法都是怎样的。
二、 uSWSGI + Nginx +Django 模式配置
1. uWSGI配置(保存为uwsgi.ini)
[uwsgi]
socket=127.0.0.1:55668
chdir=项目目录
wsgi-file=项目中wsgi.py文件的目录
processes=2
threads=4
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log
listen = 2048
buffer-size=5000
max-requests = 10000
reload-mercy = 10
master=true
lazy-apps=true
auto-procname = true
procname-prefix-spaced = test-uwsgi
DJANGO_SETTINGS_MODULE=jianyi.settings
WEBSOCKET_FACTORY_CLASS="dwebsocket.backends.uwsgi.factory.uWsgiWebSocketFactory"
2. Nginx配置
# 负载均衡使用
upstream test {
server 127.0.0.1:8081;
}
server {
listen 443 ssl;
server_name 域名/公网IP;
root html;
index index.html index.htm;
ssl_certificate 域名证书.pem;
ssl_certificate_key 域名证书.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
client_max_body_size 100M;
ssl_prefer_server_ciphers on;
include mime.types;
default_type application/octet-stream;
location / {
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
include uwsgi_params;
uwsgi_pass test; # 与upstream一致
}
}
三、 Django + gunicorn + Nginx 模式配置
1. Django settings 配置
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'gunicorn', # 需要在这里注册它才能正常使用
]
2. Nginx 配置
server {
listen 443 ssl;
server_name 域名/公网IP;
root html;
index index.html index.htm;
ssl_certificate 域名证书.pem;
ssl_certificate_key 域名证书.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
client_max_body_size 100M;
ssl_prefer_server_ciphers on;
include mime.types;
default_type application/octet-stream;
location / {
proxy_pass http://127.0.0.1:8081; #webScoket的访问地址
proxy_http_version 1.1;
proxy_set_header x-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 4s; #配置点1
proxy_read_timeout 1200s; #配置点2,如果没效,可以考虑这个时间配置长一点
proxy_send_timeout 12s; #配置点3
}
3. gunicorn 配置(保存为gunicorn.py)
import logging
import logging.handlers
from logging.handlers import WatchedFileHandler
import os
import multiprocessing
bind = '127.0.0.1:8081'
backlog = 512
chdir = '要切换到的目的工作目录'
worker_class = 'gevent'
workers = multiprocessing.cpu_count()
loglevel = 'info'
errorlog = 'gunicorn.error.log'
accesslog = 'gunicorn.access.log'
daemon = False
max_requests = 2000
proc_name = 'gunicorn_test_project'
timeout = 120
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'
keepalive = 3
limit_request_line = 5120
capture_output = True
至于启动服务我是通过supervisord 进行管理的, 可自行查询使用
总结
在服务器能正常通信后,Werkzeug提供的的WSGI并不适合生产环境。所有我这里选择uWSGI和gunicorn,也不知道是没有寻找的对应的方法或者其他, 所以最终选择了gunicorn,配置也简单。性能也超级棒,好了今天就到这里了, 如果觉得本篇记录文章对你有些许作用, 记得点赞收藏哦!
|