【Python3.7 Centos服务部署从0开始】Nginx & uWSGI 必知必会

1,591 阅读6分钟

Nginx 概述

不依赖第三方服务搭建网站服务器及功能

Nginx 作为反向代理器

Nginx不直接处理请求,而是在云主机中有一个Real Server,Nginx只是把请求转发给Real Server,等待Real Server请求处理完成后,再将请求返回给客户端

Nginx 作为负载均衡器

在环境中存在 Nginx, Real Server No.1, Real Server No.2......
Nginx一样执行请发转发,但是在 Nginx 挑选 Real Server 的时候,权重是不一样的,Nginx 中自己的一套逻辑,这套逻辑就是为了负载均衡

假设:Real Server No.1 的权重是3,Real Server No.2 的权重是1,在4个请求过来后,很可能 Real Server No.1 会收到3个请求,Real Server No.2会收到一个请求

CentOS && Nginx

安装 Nginx

yum install nginx

Nginx 常用指令

1.启动Nginx

sudo nginx

判断是否启动成功
在浏览器中输入公网的IP,出现如下的页面则为启动成功

2.停止Nginx

快速停止Nginx

sudo nginx -s stop

3.退出Nginx

与上面的 stop 相比会更加优雅一下

sudo nginx -s quit

4.重新加载Nginx的配置文件

在修改完配置后执行该命令

sudo nginx -s reload

5.重新打开Nginx的日志文件

sudo nginx -s reopen

修改Nginx的配置文件

文件存放的位置

cd /etc/nginx/
主配置文件:nginx.conf

Nginx关键配置模块

  • events 配置域:网络连接相关配置(I/O模型等)
  • server 配置域:相关服务节点配置
  • location 配置域:资源路由配置
  • http 配置域:Nginx作为网页服务器时的配置(#mail)
  • upstream 配置域:反向代理配置域

配置存在层级关系

# nginx.conf 五大配置域相关层次关系
events {
    ...
}

http {
    ...
    upstream {
        ...
    }
    
    server {
        ...
        location {
            ...
        }
    }
}

# mail {
#    ...
# }

WSGI 协议概述

全称:Web Server Gateway Interface
是 Web Server 和 Web Application 通信的规范

uWSGI概述

  • 实现了WSGI协议
  • Web服务器
  • 接收客户端请求通过协议传达给Django应用

centOS 中安装 python3.7

1.查找python的位置:

whereis python

2.安装相关包,用于下载编译python3

yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make 

3.默认的,centos7也没有安装pip

#运行这个命令添加epel扩展源
yum -y install epel-release

#安装pip
yum install python-pip

4.用pip装wget

pip install wget

5.用wget下载python3的源码包

wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz

6.手动安装

#解压
xz -d Python-3.7.0.tar.xz
tar -xf Python-3.7.0.tar

#进入解压后的目录,依次执行下面命令进行手动编译
./configure prefix=/usr/local/python3
make && make install

7.添加软链接

#将原来的链接备份
mv /usr/bin/python /usr/bin/python.bak

#添加python3的软链接
ln -s /usr/local/python3/bin/python3.7 /usr/bin/python

#测试是否安装成功了
python -V

8.更改yum配置,因为其要用到python2才能执行,否则会导致yum不能正常使用

vi /usr/bin/yum
# 把 #! /usr/bin/python修改为#! /usr/bin/python2

vi /usr/libexec/urlgrabber-ext-down
# 把 #! /usr/bin/python 修改为#! /usr/bin/python2

9.修改pip的python版本
原先的pip文件是以python2为默认版本

查找pip的位置
whereis pip => /usr/bin/pip # 这里面会有很多其他的pip,比如pip2,pip3,pip3.6等

vim /usr/bin/pip
#!/usr/bin/python2   ==>  #!/usr/bin/python3

centOS 中安装 uWSGI

1.通过pip安装 uWSGI

pip install uwsgi

如果出现 致命错误:Python.h:没有那个文件或目录 执行如下命令

yum install libffi-devel -y

2.添加软连接

ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
ln -s /usr/local/python3/bin/uwsgi /usr/sbin/uwsgi

uWSGI的基础配置

  • chdir: WSGI 应用目录
  • module:WSGI 应用的模块名字
  • processes:uWSGI 进程数
  • (http-)socket:套接字路径、地址
  • max-requests:最大并发请求数
  • vacuum:当服务器退出时是否需要自动清理文件,删除相关的pid文件 socket文件 (Boolean)

uWSGI启动(两种方式)

1.通过命令行启动

将配置通过命令行写入,进而启动

uwsgi --chdir xxxx --socket :80 --max-requests 5000 --processes 4 --module xxx.wsgi

--chdir xxxx (指定 uwsgi 的应用目录)
--socket :80 (指定端口)
--max-requests (最大请求数)
--processes (处理的进程数)
--module (指定具体的wsgi模块)

2.使用配置文件启动

1.创建 uwsgi 的配置文件

vim uwsgi-demo.ini

2.写入配置文件

[uwsgi]

chdir = /xxxx/xx

http-scoket = :80

max-requests = 5000

processes = 4

module = xxx.wsgi

3.通过命令行执行 wsgi 的配置

uwsgi --ini uwsgi-demo.ini

为什么需要uWSGI部署Django

  • Django runserver 可以直接对外服务,但是只用于测试,不安全且性能较差
  • uWSGI可以很好的进行多线程调用、进程监控,例如:uWSGI会监测django服务是否挂了,挂了会主动重启
  • uWSGI提供完善的请求日志处理

使用 uWSGI 部署测试

1.创建一个文件夹

mkdir deployment
cd deployment

2创建Python文件,定义uWSGI应用

touch uwsgi_test.py

3.写入相关配置

def application(env, start_response):
    start_response('200 OK', [('Content-type', 'text/html')])
    return [b'Hello World, Hello uWSGI']

4.运行 uwsgi

uwsgi --http :8000 --wsgi-file uwsgi_test.py

使用 uWSGI 部署 django

1.修改 django 的 setting

ALLOWED_HOSTS = ['*']  # 开启所有人都可以访问

启动方式(一),通过命令行启动

找到 django 目录下的 wsgi文件执行 django_deployment.wsgi为对应django项目下的文件相对路径

uwsgi --http :8000 --module django_deployment.wsgi

启动方式(二),通过文件配置启动

django目录中创建一个配置文件

touch django-uwsgi.ini

修改里面的内容

[uwsgi]

chdir = /root/deployment/xianshangbushuceshi/django_deployment
module = django_deployment.wsgi
http-socket = :8000

master = True
processes = 4
threads = 1
vacuum = True

启动 uwsgi 服务

uwsgi --ini django-uwsgi.ini

优化:改为后台启动,将日志打印到日志文件中
django-uwsgi.ini修改为

[uwsgi]

chdir = /root/deployment/xianshangbushuceshi/django_deployment
module = django_deployment.wsgi
http-socket = :8000

master = True
processes = 4
threads = 1
vacuum = True

# backend run uwsgi
daemonize = %(chdir)/log/uwsgi-8000.log
log-maxsize = 1024*1024*1024
pidfile = %(chdir)/pid/uwsgi-8000.pid

在对应目录创建相关的日志文件夹存放日志文件

mkdir log
mkdir pid

启动 uwsgi 服务

uwsgi --ini django-uwsgi.ini

停止 uwsgi 服务

uwsgi --stop pid/uwsgi-8000.pid

查看相关的日志log

tail -f uwsgi-8000.log

查看相关的进程id pid

cat uwsgi-8000.pid

查看进程

拿到进程 id 之后,13290是我的进程id
ps -aux | grep 12390

Django + Nginx uWSGI 部署

为什么还需要Nginx进行部署?

  • Nginx 作为知名服务器,Nginx提供更加安全的服务保障
  • Nginx 提供反向代理、负载均衡等丰富功能
  • 对于静态文件的处理能力更强

Nginx 部署的步骤

  1. uWSGI 启动 Django 应用服务
  2. 修改 Nginx 配置文件,完成反向代理配置
  3. 收集静态文件,完成静态文件寻址配置

第一步 uWSGI 启动 Django 应用服务

uwsgi --ini django-uwsgi.ini

第二步 修改 Nginx 配置文件

进入 nginx 的配置目录

cd /etc/nginx

注意该目录下的文件都是需要root权限才可以修改,如果当前不是root的话可以切换成root

sudo su

修改nginx.conf

...
http {
    ...
   upstream uwsgi {
       server 127.0.0.1:8000 # 我这里django项目是通过8000端口启动的所以就映射到:8000
   }
   
   server {
        ...
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  .actoress.xyz;  # 这里配置的是解析到该服务器的域名,前面加 . 表示全部二级域名
        charset utf-8;
        
        access_log /var/log/nginx-uwsgi.log;  # 添加日志配置
        
        location / {
            proxy_pass http://uwsgi;  # 映射到反向代理
        }
        
        # 配置静态文件寻址目录 
        location /static {
            alias /home/ubuntu/jarvis/deployment/django_deployment/static;
        }
        ...
   }
}
...

第三步 收集静态文件,完成静态文件寻址配置

添加静态文件寻址目录
django.settings.py 文件中

# 最后一行添加
STATIC_OOT = os.path.join(BASE_DIR, 'static/')

执行收集静态文件

python manage.py collectstatic