step1:原理介绍
-
nginx是什么?
关于nginx的理解,目前还比较浅。看到这篇文章不错,可以参考下:https://www.cnblogs.com/wcwnina/p/8728391.html
我的理解就是,nginx是一个高性能的,通过HTTP协议提供各种网络服务的轻量级web服务器。其特点是占用内存少,稳定性高,并且并发能力强等。 -
uwsgi、uWSGI、WSGI的关系
uWSGI是一个实现了uwsgi、WSGI协议的python web server。
WSGI是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口,可以理解为是一种协议。
uwsgi,同WSGI一样是一种协议,不过它是一种线路协议而不是通信协议。从上面的图中也可以看出,uwsgi通常用在uWSGI与其他网络服务器之间的数据通信。 -
nginx+uwsgi+django的整体架构
从上图可以看出,浏览器发出一个HTTP请求到nginx之后,由nginx通过uwsgi协议(这里存疑,也有人说是通过socket套接字进行通信)转发给uWSGI,uWSGI转发给后台的django服务,由此实现通过nginx代理uWSGI服务。
step2:环境准备&部署
- 基础环境:Ubuntu 20.04 server 64bit (64-bit) + python3
- 安装django:pip3 install django
- cd /home
- 在home目录下创建一个django项目:django-admin startproject djangoProject
- 进入到项目根目录下,执行python3 manage.py runserver 0.0.0.0:8000
如果没有报错,一般可以通过你本地的localhost:8000来访问。也可以通过命令行:curl localhost:8000。如果是通过阿里云或华为云租赁的服务器部署的django,本地想要访问的时候,需要先修改django的setting.py文件,修改ALLOWED_HOSTS参数为:ALLOWED_HOSTS = [‘*’] # 允许全部地址访问django。也可以只允许你自己可以访问。
这时候你已经拥有了一个可以正常启动的django项目。 - 安装uwsgi:pip3 install uwsgi。我用的ubuntu可以正常安装,没有报错。之前用的centos8,安装uwsgi的时候各种问题,后面再说。
- 测试uwsgi的启动,命令行启动:
uwsgi --http 0.0.0.0:8002 --chdir /home/djangoProject/ --wsgi-file djangoProject/wsgi.py --static-map=/static=static --master --processes 4 --threads 2
参数说明:
–chdir:项目根目录
–wsgi-file:django项目wsgi.py文件的相对地址
–static-map:静态文件映射
8. 进入django项目的根目录,新建一个脚本文件夹:mkdir script # 用来存放uwsgi启动/日志相关的文件。
9. 进入script,新建uwsgi.ini文件,vim uwsgi.ini
[uwsgi]
#项目目录
chdir=/home/djangoProject
#指定项目application 项目下同名目录下的wsgi.py文件
module=djangoProject.wsgi
#指定sock的文件路径(nginx转发http的目的端口)
socket=0.0.0.0:8000
# 指定IP端口,web访问入口
http=0.0.0.0:8010
# 进程个数
processess = 2
# 线程数
theads = 2
#指定启动时的pid文件路径
pidfile=/home/djangoProject/script/uwsgi.pid
#指定ip及端口(配置nginx就不需要单独启动uwsgi需要填写)
#http=0.0.0.0:8000
#启动uwsgi的用户名和用户组
#uid=root
#gid=root
#启用主进程
master=true
# 启用线程
enable-threads=true
#自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
#设置日志目录
daemonize=/home/djangoProject/script/uwsgi.log
# 日志文件的权限权限不能太低,那样的话就无法写入了。
logfile-chmod = 666
#不记录信息日志,只记录错误以及uwsgi内部消息
disable-logging=true
#buffer-size=65536
- 现在我们可以通过配置文件启动uwsgi了:uwsgi --ini uwsgi.ini
如果你正常启动的话,可以通过浏览器的8000端口访问:
- 安装nginx:apt-get install nginx # 有的可能需要root权限,由于我是root直接登录的,所以直接执行安装
正确安装如下:
命令行执行:nginx -v
表示安装成功 - 进入nginx安装路径:cd /etc/nginx/
- 将原配置文件备份一下:mv nginx.conf nginx.conf.bak,然后新建一个nginx.conf配置文件,内容如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream django {
server 你的ip:8000; # 该端口号一定要和之前uwsgi的那个文件里的socket对应的端口一致。
}
server {
listen 80;
server_name 你的ip:80; # 这儿如果你有域名的话,就将127.0.0.1:80换成你的域名,没有的话就用这个。
charset utf-8;
location /static {
alias /home/djangoProject/static; # 静态文件的路径(注意,这儿的allstatic是执行了python manage.py collectstatic之后,自动产生的一个目录,该目录下收集了你>项目中所有的静态文件。其实就是将你的静态文件复制了一遍过来)
}
location / {
# nginx转发动态请求到uWSGI
include /etc/nginx/uwsgi_params;
uwsgi_connect_timeout 20;
uwsgi_pass 你的ip:8000;
}
}
}
- nginx常用命令:
./nginx # 启动
./nginx -s reload # 重载
./nginx -s stop # 停止
- 到这时候,你的nginx+uwsgi+django项目已经基本部署成功了,可以通过页面ip:80端口来访问,同时查看对应的日志,可以看到访问的记录。
nginx日志路径:/var/log/nginx
uwsgi日志路径:/home/djangoProject/script
step3:问题及使用到的小知识记录
- 端口占用情况
1.1 根据端口号查询:lsof -i:端口号
1.2 根据程序查询:netstat -ap|grep 程序名 - 安装uwsgi出错:
2.1 一开始用的是centos8,自带python3,但是缺少python依赖,解决如下:https://blog.csdn.net/weixin_45503064/article/details/123974713?spm=1001.2014.3001.5502
2.2 centos6/7,由于是python2的环境,想切换成python3的环境,弄了挺久的,但是失败了。
2.3 由于centos已经停止维护了,在时候centos8的时候真的是各种问题,包括yum源,切换阿里云镜像找不到对应的镜像地址报404。。层出不穷。最后不得不切换成ubuntu20。 - 找不到nginx路径的时候,可以:whereis nginx,每个目录下找找就找到了。
- 查看日志:tail -f access.log
- uwsgi报异常:invalid request block size: 21573 (max 4096)…skip
原因:uwsgi启动的时候默认分配一个小的buffer(约4k),可以在配置文件里进行添加参数:buffer-size=65536