一、前言
在网页开发中,Django框架提供了快速开发的能力,尤其对于python用户,在网页部署中,Linux操作系统以其稳定性和灵活性成为部署Web应用的首选平台。结合Nginx,一个高性能的HTTP和反向代理服务器,可以为Django应用提供额外的安全性和负载均衡能力,从而提高应用的响应速度和可靠性。
本文探讨如何将Django应用部署在Linux环境下,并利用Nginx进行监听,以实现高效、安全的Web服务。
二、uWSGI
1、WSGI协议
WSGI(Web Server Gateway Interface),也就是“Web服务器网关接口”,是一种Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。简单的说就是服务器与应用交互的规范协议标准。【注意:WSGI仅仅是一个规范协议标准,不是一个具体的实现。它需要通过具体的WSGI服务器来实现,例如Gunicorn、Flask的内置服务器等】
举例说人话:你开发了python的web应用(app),这个app要放到服务器(server)上供用户从客户端浏览器(browser)去访问,那么就形成了这样的网络传输过程,
类似客户端和服务器请求响应的HTTP协议,WSGI是专为python语言设计的网络服务器与应用之间的协议。
2、uWSGI服务
uWSGI是一个实现了WSGI规范的服务器,而且它不仅仅局限于WSGI。uWSGI支持多种协议和接口,使其可以与多种语言编写的Web应用进行交互,包括但不限于Python。它不仅实现了WSGI规范,还提供了许多高级功能,如进程管理、信号处理、日志记录、路由、负载均衡等。
至此便有了如下网络传输过程
【注意:也就是说WSGI是协议,uWSGI才是真正的可接受发送请求与响应的网络服务器】
3、django应用如何启动服务
(1)对于django来说,大家开发都知道,可以直接通过python manage.py runserver来启动服务,他的过程传输过程如下
(2)同时也可以实用uWSGI来访问
(3)以上都是我们开发中临时启动服务的方式,尤其是通过runserver,方便快速,但真正部署上线时,一般会引入nginx.
Nginx在Django部署中主要负责处理HTTP请求(反向代理)、提供静态文件、实现SSL加密和负载均衡等功能。
Nginx通常不直接与Django应用交互,而是通过uWSGI与Django应用进行通信。Nginx接收到客户端的请求后,会将这些请求转发给uWSGI服务器。
uWSGI作为Django应用的代理,接收来自Nginx的请求,并将其传递给Django应用进行处理。处理完成后,uWSGI将响应返回给Nginx,再由Nginx发送给客户端。
三、uWSGI启动网页
综上,理论说完了,那么实际开始部署。如果是在本地window开发,那么直接runserver启动即可,所以这里是服务器上通过uwsgi启动。
首先,默认已经将项目上传至Linux服务器了。文件地址及项目目录如下(其中uwsgi文件夹可先不创建):
此时,也可通过runserver启动,输入如下
python3 manage.py runserver 192.168.174.101:8000
【tip:(1)python3是因为我设置了python3.6.5的系统路径(2)如果启动后在linux上成功了服务,但是浏览器无法访问,很可能是8000端口防火墙没开,配置如下】
# 开放linux防火墙的端口
1、查看已开放的端口:sudo firewall-cmd --list-ports
2、开放端口(以开放8000端口(HTTP)为例):sudo firewall-cmd --zone=public --add-port=8000/tcp --permanent
3、重新加载firewalld配置:sudo firewall-cmd --reload
4、验证端口是否开放:sudo firewall-cmd --list-ports
下面正式说明如何通过 uWSGI启动,以及如何配置。
1、安装 uWSGI
# linux命令安装:
pip3 install uwsgi
2、准备 Django 应用
确保你的 Django 应用已经可以正常运行。通常,你需要一个 wsgi.py
文件在你的应用目录中(与django的setting在同目录下,此文件在开发django应用生成框架时,会自动生成 ):
# techsite/wsgi.py
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "techsite.settings")
application = get_wsgi_application()
3、通过uWSGI启动网页
uwsgi --http 192.168.174.101:8000 --file techsite/wsgi.py --static-map=/static=static
--static-map=/static=static:这个是你的静态文件存放的相对地址
注意:一定要在manage.py同级目录下输入命令启动,否则无法访问。
四、Nginx启动网页
默认已经安装了Nginx,安装了uWSGI
1、配置uWSGI
直接通过python的uWSGI命令方式启动是不需要配置django的uwsgi的,但是如果通过nginx去与django的uwsgi交互,那么就需要了,可以理解为nginx操作配置文件启动并交互。
在manage.py的同目录下创建一个文件夹uWSGI 用于存放配置文件,其中最重要的配置文件为,uwsgi.ini:
[uwsgi]
#django项目的根目录,即manage.py所在的目录
chdir=/data/web_luping/techsite/
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 指定项目的application
module=techsite.wsgi:application
# 指定sock的文件路径
socket=/data/web_luping/techsite/uwsgi/uwsgi.sock
# 启动主进程
master=true
# 进程数
workers=5
pidfile=/data/web_luping/techsite/uwsgi/uwsgi.pid
# 自动移除unix socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启动线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/data/web_luping/techsite/uwsgi/uwsgi.log
这里说明一下uwsgi常用文件:
uwsgi.ini:`uwsgi.ini` 是 uWSGI 的配置文件,用于定义 uWSGI 服务器的参数和选项。在这个配置文件中,您可以指定 Django 应用程序的位置、监听的 Socket 地址、进程数、线程数、日志输出等信息。通过修改 `uwsgi.ini` 文件,可以对 uWSGI 服务器进行灵活的配置。
uwsgi.log:`uwsgi.log` 是 uWSGI 服务器的日志文件,用于记录 uWSGI 服务器的运行日志、错误信息等。通过查看 `uwsgi.log` 文件,您可以了解 uWSGI 服务器的运行状态,排查问题和进行故障排除。
uwsgi.pid:`uwsgi.pid` 文件是 uWSGI 服务器的进程 ID 文件,用于记录 uWSGI 服务器的进程 ID。在启动 uWSGI 服务器时,会将当前进程的进程 ID 写入 `uwsgi.pid` 文件中,以便后续管理和监控 uWSGI 服务器进程。
uwsgi.sock:`uwsgi.sock` 是 uWSGI 服务器与 Nginx 之间通信的 Unix Socket 文件。Nginx 通过监听该 Socket 文件与 uWSGI 服务器进行通信,将客户端请求转发给 uWSGI 服务器处理,并将处理结果返回给客户端。通过 Unix Socket 文件的方式,可以实现高效的通信和数据传输。
综上,`uwsgi.ini` 是 uWSGI 的配置文件,用于定义服务器参数;`uwsgi.log` 是日志文件,记录服务器日志信息;`uwsgi.pid` 是进程 ID 文件,记录服务器进程 ID;`uwsgi.sock` 是与 Nginx 之间的通信 Socket 文件。这些文件在 Django 应用程序使用 uWSGI 服务器时起着重要作用,帮助配置、监控和通信。
配置完uwsgi.ini后即可通过命令启动(不是说一定要启动,而是看一下能启动)
uwsgi --ini uwsgi.ini
输入以下命令,搜索所有关于uwsgi正在运行的进程,发现已经启动了uwsgi服务。
ps -ef |grep -i uwsgi
此时uwsgi目录下会生成一系列相关文件
到此,django的uwsgi 配置完毕。
2、配置Nginx
安装完nginx后,找到配置文件,一般地址为:/etc/nginx/nginx.conf
此处我计划网页的端口设为8000,并且要求django的首页要是index.html,配置如下即可访问【tip:要将8000的防火墙打开,前面有说怎么做】
server {
listen 8000;
server_name localhost;
location / {
root /data/web_luping/techsite;
include /etc/nginx/uwsgi_params;
uwsgi_pass unix:/data/web_luping/techsite/uwsgi/uwsgi.sock;
uwsgi_param UWSGI_SCRIPT techsite.wsgi;
uwsgi_param UWSGI_CHDIR /data/web_luping/techsite/uwsgi;
}
location /static{
alias /data/web_luping/techsite/static;index index.html;
}
}
配置完成后,启动或刷新nginx
# 启动Nginx服务
systemctl start nginx
# 关闭Nginx服务
systemctl stop nginx
# 重启Nginx服务:
systemctl restart nginx
# 刷新Nginx配置(如果Nginx正在运行,且你更改了配置文件,可以使用以下命令来重新加载配置而不中断服务):
nginx -s reload
# 查看Nginx的状态:
systemctl status nginx
# Nginx的配置文件地址
/etc/nginx/nginx.conf
# Nginx的日志文件地址
/var/log/nginx/error.log
3、通过Nginx启动网页
# 首先启动uwsgi服务
uwsgi /data/web_luping/techsite/uwsgi/uwsgi.ini
# 再次启动或刷新nginxnginx -s reload
自此,便可以 192.168.174.101:8000 访问了
4、其他注意
(1)在启动nginx时可能显示没有权限的报错,如下这种,可以参考以下方案解决:
(2)如果配置nginx的监听端口发现被占用了,那么可以这样做:
使用以下命令来查找占用端口8000的进程:sudo lsof -i :8000
如果能杀掉进程,则:sudo kill -9 PID,这PID就是找到的进程ID
测试Nginx配置:sudo nginx -t
重启Nginx服务:sudo systemctl restart nginx
(3)一些平时修改django后,需要刷新网络服务的常用命令:
# 关闭uwsgi服务,此操作仅关闭服务,不让外部访问
uwsgi --stop /data/web_luping/techsite/uwsgi/uwsgi.pid
# 启动uwsgi服务uwsgi /data/web_luping/techsite/uwsgi/uwsgi.ini
# 重启nginxnginx -s reload
更新前后端代码都需要执行上述三步操作,更新js等前端代码后再执行上述三步
参考文献
本文关于django网页的部署,有任何不足之处望指正。部分知识灵感来源以下文章,特此感谢。