nginx+uwsgi部署服务器
uWsgi简介:
说Uwsgi之前,先说一下Wsgi。
什么是Wsgi?
WSGI: 是一种Web服务器网关接口,它是一个Web服务器(如Nginx) 与应用服务器(如uWSGI服务器)通信的一种规范。
uWSGI是一个Web服务器,它实现了WSGI协议,uwsgi,http等协议,Nginx中HttpUwsgiModul的作用是与uWSGI服务器进行交换
那么那些框架自带了Wsgi Server呢?
很多框架都自带了WSGI Server, 比如: Flask、 Webpy、 Dajngo、 CherryPy等等。当然性能都不好,自带的Web Server更多的是本地测试用途,发布时则使用生产环境的WSGI Server或者是联合Nginx做Uwsgi。
简单的来讲Wsgi就是,标准,
比如: 一个德国人跟一个法国人聊天,他们要想聊天可以通过一个标准的国际语言: 英语来进行交互。
要注意 WSGI/uWSGI/uwsgi 这三个概念的区分。
WSGI是一种通讯协议
uwsgi同WSGI一样是一种通信协议
而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
为什么uWSGI还需要nginx,应为Nginx具备了优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样就实现了,动静分离。 也可以更好的达到客户端的效果。
实际部署过程
安装nginx,wsgi
在服务器下载uwsgi和nginx(已下载可忽略)可以使用pip下载uwsgi:pip install uwsgi
下载nginx:apt-get install nginx
如果nginx下载失败,可以先更新apt源:apt-get update
更新后再次下载nginx
将项目文件夹传输到服务器(比如根目录下的home文件夹下)
scp -r 本机下项目的路径 root@***.***.***.***:/home/ 例:scp -r /home/guagua/test.py root@11.22.33.44:/home/file
传输完成后在项目主目录下配置uwsgi
创建uwsgi.ini
vim uwsgi.ini (vi uwsgi.ini)
#以下为添加操作
[uwsgi]
socket=0.0.0.0:5000 # 可配置成别的端口
chdir=项目的路径
wsgi-file=启动文件的路径
callable=app
processes=4
threads=10
master=true
#virstualenv = python虚拟环境路径 (如果没有配置虚拟环境,则不用)
daemonize=/data/log/项目名/uwsgi.log #指定uwsgi日志存储位置,没有这个文件夹的话先进行创建
buffer-size=32768
listen=l024
配置nginx(nginx的配置文件默认为/etc/nginx/nginx.conf)
在http{}里面添加内容:
server {
listen 80; #监听端口,也就是我们在浏览器要访问的端口
server_name 1.112.133.222; # 外网访问服务器的地址
large_client_header_buffers 4 16k; # 读取大型客户端请求头的缓冲区的最大数量和大小
client_max_body_size 300m; #设置nginx能处理的最大请求主体大小。
client_body_buffer_size 128k; #请求主体的缓冲区大小。
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_buffer_size 64k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
location / {
uwsgi_pass 127.0.0.1:5000; # uwsgi端口号 要和uwsgi端口保持一致△
include uwsgi_params;
uwsgi_send_timeout 600; # 指定向uWSGI传送请求的超时时间,完成握手>后向uWSGI传送请求的超时时间。
uwsgi_connect_timeout 600; # 指定连接到后端uWSGI的超时时间。
uwsgi_read_timeout 600; # 指定接收uWSGI应答的超时时间,完成握手后接收uWSGI应答的超时时间。
}
}
可能会遇到的问题,找不到一些文件或路径,哪个找不到直接创建就行
----⬇️配置https方式:
server {
#监听443端口
listen 443 ssl;
#你的域名
server_name www.域名.com;
#ssl证书的pem文件路径
ssl_certificate /etc/nginx/cert/ssl文件.pem;
#ssl证书的key文件路径
ssl_certificate_key /etc/nginx/cert/ssl文件.key;
location / {
proxy_pass http://127.0.0.1:5001;
uwsgi_pass 127.0.0.1:5001;
include uwsgi_params;
}
}
server {
listen 80;
server_name www.域名.com;
#将请求转成https
rewrite ^(.*)$ https://$host$1 permanent;
}
详细操作方案:http://t.zoukankan.com/lixianguo-p-12517314.html
启动 nginx
service nginx start
service nginx status # 查看nginx状态,是否启动
service nginx restart # 重启nginx
ps -ef |grep nginx # 查看已启动nginx的进程号
kill -9 nginx主进程号
如果启动失败,查看nginx的日志找到报错原因,日志在/var/log/nginx/error.log
tail -f error.log #查看nginx日志
启动uwsgi进入项目下(uwsgi.ini所在的文件夹下)
uwsgi -d --ini uwsgi.ini # 启动
启动成功:[uWSGI] getting INI configuration from uwsgi.ini
ps -ef |grep uwsgi 查看当前当前开启的uwsgi进程
关闭方法与nginx类似
启动失败可查看uwsgi日志,日志位置在配置文件中我们自己配置的路径 tail -f uwsgi
都启动成功,访问
curl +ip 运行
如果遇到问题,先查看nginx是否启动成功,如果没成功,查看日志 cd /var/log/nginx/error.log
当nginx成功以后再去排uwsgi的错误,看看是不是Flask项目的python环境没对应上,或者是缺少某些模块 查看uwsgi日志 找到日志文件的目录 tail -f uwsgi.log
提升uwsgi配置:
如果没有设置uwsgi的--listen,如果sysctl -a | grep net.core.somaxconn发现net.core.somaxconn=128。
那你使用uwsgi启动的服务,单机最大支持并发数为100*(启动的uwsgi进程数)。
如果启动进程为4个,则最大并发只能支持400,这样会在uwsgi的log日志中出现错误uWSGI listen queue of socket 4 full。
同时,nginx对应也会出现错误***** upstream time out。
修补措施:
1.修改系统参数
vim /etc/sysctl.conf
在文件最后添加一行记录net.core.somaxconn = 1024
执行sysctl -p重新load参数设置,这样会立即生效,并且以后重新启动机器也会生效。
2.设置uwsgi启动的--listen 1024.
这样 你的机器并发数就可以得到一个很大的提升。```
常用命令
```python
ps -aux|grep python3 查看当前python进程
kill -9 进程号 关闭当前进程号