nginx+uwsgi的坑

部署了两遍,又读了一些文章,才渐渐理解了这两个东西,

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

你可能感兴趣的:(nginx+uwsgi的坑)