我们使用 python manage.py runserver 来运行服务器。这只适用测试环境中使用。
正式发布的服务,我们需要一个可以稳定而持续的服务器,比如apache, Nginx, lighttpd等,本文将以 Nginx 为例。
说到uWSGI不得不提WSGI和uwsgi这两个知识点。
全称是web server gateway interface(web 服务期网关接口),它是一种描述web服务器如何与应用程序(django、flask)通信的规范。
server和application的规范在PEP3333中有具体的描述,要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web 框架有django、flask、bottle。
与WSGI一样是uWSGI通信的一种协议,用于定义传输信息类型(type of information)。每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说是fcgi协议的10倍快。
uWSGI:
是一个全功能的http服务器,实现了WSGI规范、uwsgi协议、http协议等。它要做的就是把http协议转化为语言支持的网络协议。比如把http协议转化成WSGI规范,让python可以直接使用。
注意:我在Mac上配置uwsgi和nginx
pip3 install uwsgi
在项目的同目录下创建一个uwsgi.ini文件,文件名可以随意,一般使用项目名,我为了便于区分所以起名uwsgi
[uwsgi] http=127.0.0.1:8007 chdir=/Users/wei/python_project/pyhon_testing/Mars wsgi-file=Mars/wsgi.py process=4 threads=2 pidfile=uwsgi.pid daemonize=uwsgi.log master=True
配置解析:
注意: chdir和wsgi-file.py一定不能配置错的路径,不然会出错,很多人配置错误就是因为这两个找不到项目
#开头必须是[uwsgi] [uwsgi] #现在还没有配置nginx所以暂时使用http http=127.0.0.1:8007 #配置项目路径,项目的所在目录**必须是:绝对路径** chdir=/Users/wei/python_project/pyhon_testing/Mars #配置wsgi接口模块文件路径,**相对路径** wsgi-file=Mars/wsgi.py #配置启动的进程数,这个多配无意,按照自己电脑核去配置 processes=4 #配置每个进程的线程数 threads=2 #配置启动管理主进程 master=True #配置存放主进程的进程号文件,启动uwsgi后**uwsgi.pid文件会自动生成** pidfile=uwsgi.pid #配置dump日志记录 daemonize=uwsgi.log`
cd 到uwsgi.ini配置文件所在目录
命令:uwsgi --ini uwsgi.ini
命令解析:uwsgi和–ini是关键命令不可以错,uwsgi.ini是ini配置文件名
这就代表着启动好了,但是我们还要看一下是否真的成功
ps aux|grep 'uwsgi'
这就是说明启动成功
cd 到uwsgi.pid配置文件所在目录
注意: uwsgi.pid是自动生成的,所以按照我们上面的配置文件路径,uwsgi.pid和uwsgi.ini在同一个目录下
uwsgi --stop uwsgi.pid
uwsgi --reload uwsgi.pid
sudo lsof -i :8007
看到有,我们将端口kill掉
sudo kill -9 43057
43057是端口pid
然后访问你的路由测试一下,访问成功说明配置没有问题
Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。
上图基本上说明了当下流行的技术架构,其中Nginx有点入口网关的味道。
经常听人说到一些术语,如反向代理,那么什么是反向代理,什么又是正向代理呢?
上面就是一个简单的介绍,如果想深入了解可以查看中文官网
django和nginx的流程
sudo brew install nginx
nginx -v
/usr/local/etc/nginx
vim /usr/local/etc/nginx/nginx.conf
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 8080; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { #root html; root /Users/XXX/Downloads/Autotestplat-master;# 项目目录 index index.html index.htm; uwsgi_pass 0.0.0.0:8001; include /usr/local/etc/nginx/uwsgi_params; # uwsgi_params文件的地址 } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} include servers/*; }
server { listen 8080; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { #root html; # root /Users/liuwei/Downloads/Autotestplat-master;# 项目目录 # index index.html index.htm; # 新添加的内容 uwsgi_pass 127.0.0.1:8007; include /usr/local/etc/nginx/uwsgi_params; # uwsgi_params文件的地址 }
只添加了两行,include要改成自己的uwsgi_params文件路径
新增内容
uwsgi_pass 127.0.0.1:8007; include /usr/local/etc/nginx/uwsgi_params;
检查nginx配置文件语法是否有问题,命令
如果配置有问题,则会提示某一行的错误
nginx -t
图上:我这个是没有问题的
which nginx
sudo nginx
也可以使用下面的命令启动,但是配置文件nginx.conf修改后用这个命令执行不生效,故不建议使用:
sudo brew services start nginx
前面我们访问是通过http方式请求,uwsgi进行转发,现在我们配置了nginx,那么就要通过nginx负责请求并转发给uwsgi
说明: Nginx负责接收请求,并把请求转发给后面的uWSGI,此模式下,uWSGI需要以socket模式启动
[uwsgi] # 去掉 # http=127.0.0.1:8007 # 改为 socket=127.0.0.1:8007
[uwsgi] # http=127.0.0.1:8007 socket=127.0.0.1:8007 chdir=/Users/xxx/python_project/pyhon_testing/Mars wsgi-file=Mars/wsgi.py process=4 threads=2 pidfile=uwsgi.pid daemonize=uwsgi.log master=True
在uwsgi.ini所在文件下执行
uwsgi --ini uwsgi.ini
大家有没有发现uwsgi配置了socket后,启动数量不一样了和之前,不一样说明配置成功了,因为它http模式启动,它会自动启动一个http进程来进行解读,所以它比socket多一个进程
首先我们看一下这个图
我们应该先访问nginx也就是80,然后又nginx进行分配到uwsgi8007
一定一定要记住,先访问80也就是nginx,nginx默认是80
# nginx停止命令 nginx -s stop # 启动 nginx # 重启 nginx -s reload
1:uwsgi修改后一定要重启,重启
2:nginx的路径配置一定要正确,一定要正确
3:uwsgi的配置路径一定要正确,一定要正确
4:启动项目,我的话先启动nginx然后在启动uwsgi,这个没有特殊要求
5:如果配置好,然后启动没有任何问题,但是还是无法访问,是这个原因
listen 8000; # 这个端口是nginx用来监听uwsgi的,默认的是80,总之项目是通过下面的server_name:8080来访问的
以上就是我的配置全过程,如果对你有帮助,请给我点个赞,内容可能有点乱,但是我是按照自己的配置流程所记录的,感谢大家,参考官方
附加
pip freeze > pkg.txt
将当前生产环境下 Python 的模块收集起来存放到 pkg.txt 文件里
pip install -r pkg.txt
在部署环境下降生产环境下的需要模块全部安装