部署了两遍,又读了一些文章,才渐渐理解了这两个东西,
1. uwsgi
实际上是python的一个模块,可以通过pip install uwsgi
进行安装,是一个由python实现的web容器,可以兼容性比较好地发布Django,Flask等pythonweb框架的应用
基本配置:
[uwsgi]
# 使用nginx连接时使用,Django程序所在服务器地址
# 选择内网IP和端口
socket=127.0.0.1:8000
# 项目根目录
chdir=/home/ccb/project/CET4
#项目中wsgi.py文件的相对目录
wsgi-file=CET4/wsgi.py
# 进程数
processes=2
# 线程数
threads=2
# uwsgi服务器的角色
master=True
# 存放进程编号的文件
pidfile=uwsgi.pid
# 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。以前的runserver是依赖终端的
daemonize=logs/uwsgi.log
# 指定虚拟环境所在目录,不能填相对目录
virtualenv=/home/ccb/.virtualenvs/blog
因为端口是有很多的,所有我们可以布置好几个uwsgi,然后都放到nginx上,这就实现了一个服务器部署多个项目
tips:就是关于socket和http的差别。从概念上来说,socket本身不是协议而是一种具体的TCP/IP实现方式,而HTTP是一种协议且基于TCP/IP。具体到这个配置这里来,如果我只配了socket = 127.0.0.1:5051的话,通过浏览器或者其他HTTP手段是无法成功访问的。而在uwsgi这边的日志里会提示请求包的长度超过了最大固定长度。另一方面,如果配置的是http = 127.0.0.1:5051的话,那么就可以直接通过一般的http手段来访问到目标。但这会引起nginx无法正常工作。正确的做法应该是,如果有nginx在uwsgi之前作为代理的话应该配socket,而如果想让请求直接甩给uwsgi的话那么就要配http。
2.nginx
我们口中所说的服务器,一种是硬件我们的主机,另一种是服务器程序比如nginx apche之类的.
我们的uwsgi是不能加载静态文件的,如果我们需要加载静态文件和媒体文件,那么就要uwsgi和nginx配合使用
我们可以在/etc/ngin/conf.d/
下创建一个nginx_my.conf文件
在这个文件中我们可以写多个 下面的upstream
upstream MyBlog {
# 此处为uwsgi运行的ip地址和端口号
server 127.0.0.1:8000;
}
这样我们就可以实现,一个服务器部署多个项目喽
下面是https项目的基本配置
server{
# 监听443端口
listen 443;
# 对应的域名,这里需要带上www
server_name www.cbmm.xyz;
server_name_in_redirect off;
ssl on;
#从腾讯云获取到的第一个文件的全路径
ssl_certificate /etc/ssl/cbmm.xyz.crt;
#从腾讯云获取到的第二个文件的全路径
ssl_certificate_key /etc/ssl/cbmm.xyz.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
# 媒体文件
location /media {
alias /home/ccb/project/CET4/media;
}
# 静态文件
# location /static {
# alias /home/ccb/project/blog/static;
# }
# 主目录
location / {
uwsgi_pass CET4;
include /etc/nginx/uwsgi_params;
}
}
重定向服务
# 重定向服务
server{
listen 80;
server_name cbmm.xyz www.cbmm.xyz;
rewrite ^/(.*)$ https://www.cbmm.xyz:443/$1 permanent;
}
注意:
- 如果我们的nginx启动了,但是uwsgi没有启动,那么将会报错502
- 如果我们的nginx报错status,那么应该是配置里有地方不小心写错了
nginx+uwsgi+django时,不会自动加斜杠问题
解决办法: 很多人都说需要加 server_name_in_redirect off;
,好像新版本自动就是off,重定向到当前url
我踩坑踩了两天,是因为我自作聪明,在我的settings中加的一个配置
# 强制在项目中每个链接必须写全,不自动加斜杠(不影响手输网址)
APPEND_SLASH = False
我当时以为这个能防止不写全报错的问题,后来改成True就解决问题了
最后: 部署需要多练习,多理解nginx的作用和配置目的,如果修改了项目需要重启nginx
systemctl restart nginx
不行的话,重启uwsgi
uwsgi --reload uwsgi.pid