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

Nginx 概述

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

Nginx 做为反向代理器

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

Nginx 做为负载均衡器

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

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

CentOS && Nginx

安装 Nginx

yum install nginx
复制代码

Nginx 经常使用指令

1.启动Nginx

sudo nginx
复制代码

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

2.中止Nginx

快速中止Nginxubuntu

sudo nginx -s stop
复制代码

3.退出Nginx

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

sudo nginx -s quit
复制代码

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

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

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
复制代码
相关文章
相关标签/搜索