django网页在Linux的部署

一、前言

在网页开发中,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
# 再次启动或刷新nginx

nginx -s reload

自此,便可以 192.168.174.101:8000 访问了

4、其他注意

(1)在启动nginx时可能显示没有权限的报错,如下这种,可以参考以下方案解决:

启动 Nginx 报错 Starting nginx: nginx: [emerg] bind() to 0.0.0.0:6666 failed (13: Permission denied) - 孟郎郎 - 博客园 (cnblogs.com)

(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
# 重启nginx

nginx -s reload

更新前后端代码都需要执行上述三步操作,更新js等前端代码后再执行上述三步

参考文献

本文关于django网页的部署,有任何不足之处望指正。部分知识灵感来源以下文章,特此感谢。

Nginx+uWSGI+Django部署生产环境_哔哩哔哩_bilibili

django配置uwsgi-nginx全过程_django uwsgi nginx-CSDN博客

  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值