一、前言
在部署项目前,你已有一个能够在你本机测试过,能正常启动的Django项目(毕竟本文主要讲解部署Django项目),以及掌握了Linux系统的一些基本命令。
相关链接:
二、WSGI、uWSGI、uwsgi详解
WSGI:(Web Server Gateway Interface)服务器网关接口,是一种协议。要实现WSGI协议,必须同时实现Web服务器和Web应用,因为它描述的是Web服务器(如nginx、uWSGI等服务器)如何与Web应用(如用Django框架写的程序)进行通信。
uWSGI:是一个Web服务器,实现了WSGI协议、uwsgi协议、http协议等。它要做的就是把http协议转化成语言支持的网络协议。比如把http协议转化成WSGI协议,让Python可以直接使用。 Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
uwsgi:是一种线路协议,并非是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型。它与WSGI相比是两样东西。
三、uwsgi安装与基本使用
pip3 install uwsgi
基本测试
新建一个test.py:
def application(env, start_response): start_response("200 OK", [("Content-Type", "text/html")]) return [b"Hello World"]
uwsgi热加载python应用程序:
uwsgi --http :8000 --wsgi-file --py-autoreload=1 test.py
PS:如果执行了上面命令显示 uwsgi: command not found
则配置软链接,方便使用:
ln -s python安装路径/bin/uwsgi /usr/bin/uwsgi
例如我的:
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
启动成功后,打开浏览器,访问"服务器公网IP:8000″(或者在本机访问""http://localhost:8000),就可以看到"Hello World"字样了。
PS:我使用的是阿里云服务器,如果你也是;项目部署好了,在浏览器打不开的话,可以登录服务器控制台,添加安全组规则即可,具体请自行百度。
用uwsgi启动flask
# app.py from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "这是我的第一个flask程序!" if __name__ == "__main__": app.run()
PS:如果是flask程序,需要再加 --callable app
uwsgi --http :8000 --wsgi-file app.py --callable app
用uwsgi启动django
修改配置文件,将 ALLOWED_HOSTS 设置为:当前服务器IP或*,如:
ALLOWED_HOSTS = ["*",]
启动django:
uwsgi --http :8000 --chdir /usr/local/django/mysite/ --wsgi-file mysite/wsgi.py
根据配置文件启动
1、创建配置文件 uwsgi.ini
[uwsgi] # 指定ip端口(直接运行设置为http、用nginx则设置为socket) http = 0.0.0.0:8000 # 执行项目的目录 chdir = /usr/local/django/mysite/ # Django的wsgi.py文件 module = mysite.wsgi # 相当于mysite/wsgi.py # 允许主进程存在 master = true # 开启的进程数量 processes = 4 # 后台运行 daemonize2 = true # uwsgi.pid文件可以用来重启和停止uwsgi服务 pidfile = %(chdir)/uwsgi/uwsgi.pid # uwsgi.status可以用来查看uwsgi的服务状态 stats = %(chdir)/uwsgi/uwsgi.status # 当服务器退出的时候自动清理环境 vacuum = true # 将日志打到指定的日志文件 logto = /tmp/mysite.log # 虚拟环境 home=/root/envs/pdsite
2、根据配置文件启动(注意路径)
# 启动 uwsgi --ini uwsgi.ini # 停止 uwsgi --stop uwsgi.pid # 重启 uwsgi --reload uwsgi.pid # 查看uwsgi的服务状态 uwsgi --connect-and-read uwsgi.status
此时访问时,会出现找不到静态文件的错误。
想要uwsgi处理静态文件,需要先将django的静态文件收集到制定目录,然后再设置对应关系。
1、收集django静态文件
- 在django的配置文件中添加:STATIC_ROOT = os.path.join(BASE_DIR, "allstatic");
- 执行 python3 manage.py collectstatic 命令,至此django项目所有相关静态文件都会收集到指定目录。
2、设置uwsgi静态文件对应关系
在上面的 mysite.ini 文件中加入以下配置:
# static-map(映射一个资源到静态文件区) static-map = /static=/usr/local/django/mysite/allstatic
映射媒体文件(看你需不需要配置):
static-map = /media=/usr/local/django/mysite/media
再次使用配置文件方式启动,所有静态文件就可以加载了。
四、Nginx
Nginx是一款轻量级的高性能Web服务器/反向代理服务器。我们可以利用Nginx做反向代理、负载均衡以及处理静态文件。
安装:点击这里
下面的所有配置都是为Django项目配置的
uwsgi官网:使用uwsgi和Nginx设置Django和Web服务器
配置nginx
首先要确保你安装的Nginx中有uwsgi_params文件哦,如下;没有可以从这里获取:点我
配置nginx.conf:
user root; worker_processes 4; error_log /opt/nginx/logs/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /opt/nginx/conf/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /opt/nginx/logs/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; # 定义负载均衡池,名字叫做django,池子中写入uwsgi发布django的socket地址 upstream django { server 127.0.0.1:8001; } server { listen 80; server_name www.zouxin.top; charset utf-8; client_max_body_size 75M; location / { # nginx自带ngx_http_uwsgi_module模块,起到nginx和uwsgi交互作用 # 通过uwsgi_pass设置服务器地址和协议,将动态请求转发给uwsgi处理 uwsgi_pass django; include uwsgi_params; } # nginx处理静态页面资源 location /static { alias /usr/local/django/mysite/allstatic; } } }