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

5、关闭端口:sudo firewall-cmd --remove-port=7017/tcp --permanent

下面正式说明如何通过 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_clp/webSite/
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 指定项目的application
module=webSite.wsgi:application
# 指定sock的文件路径
socket=/data/web_clp/webSite/uwsgi/uwsgi.sock
# 启动主进程
socket=0.0.0.0:7017
master=true
# 进程数
workers=5
pidfile=/data/web_clp/webSite/uwsgi/uwsgi.pid
# 自动移除unix socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启动线程
enable-threads=true
# 设置自中断时间
harakiri=7200
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/data/web_clp/webSite/uwsgi/uwsgi.log

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 7016;
        server_name localhost;

        location / {
            root /data/web_project/webSite;
            include /usr/local/nginx/conf/uwsgi_params;
            uwsgi_pass 127.0.0.1:7017;
            uwsgi_param UWSGI_SCRIPT  webSite.wsgi;
            uwsgi_param UWSGI_CHDIR  /data/web_project/webSite/uwsgi;
        }
        location /static{
            alias /data/web_project/webSite/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博客

部署 Django 应用到 Linux 服务器后,时间显示不一致的问题通常与 Django 的时区设置和服务器的系统时区配置不匹配有关。以下是详细的解决方案: ### 配置 Django 使用正确的时区 Django 默认使用 UTC 时间,而服务器可能使用本地时间(例如北京时间,UTC+8)。为了确保时间显示正确,需要在 `settings.py` 文件中显式指定时区为本地时区: ```python # settings.py TIME_ZONE = 'Asia/Shanghai' # 设置为中国时区 USE_TZ = False # 关闭时区支持,使用本地时间 ``` 此设置将确保 Django 在处理日期和时间时使用指定的时区,而不是默认的 UTC 时间[^1]。 ### 确保数据库存储的是本地时间 如果使用了 `USE_TZ = True`(即启用时区支持),Django 会将所有时间存储为 UTC,并在读取时转换为 `TIME_ZONE` 指定的时区。然而,如果数据库中已经存在 UTC 时间但未启用时区支持,则会导致时间偏差。 - 如果希望直接存储本地时间,请务必设置 `USE_TZ = False`。 - 如果希望存储 UTC 时间并自动转换为本地时间显示,请保持 `USE_TZ = True` 并确认前端展示逻辑是否也正确应用了时区转换。 ### 同步服务器系统时区 Linux 服务器的系统时区应与 Django 中配置的 `TIME_ZONE` 一致。可以使用以下命令查看当前系统的时区设置: ```bash timedatectl ``` 如需更改系统时区,可使用如下命令(以 Ubuntu 为例): ```bash sudo timedatectl set-timezone Asia/Shanghai ``` 该操作将使系统时间与 Django 应用的时间逻辑保持一致,避免因系统时间错误导致的数据展示问题[^1]。 ### 定时任务中的时区设置 如果项目中使用了定时任务(如 APScheduler),也需要确保调度器使用的时区与 Django 的 `TIME_ZONE` 一致。可以在初始化调度器时传入时区参数: ```python from apscheduler.schedulers.background import BackgroundScheduler from django_apscheduler.jobstores import DjangoJobStore from django.conf import settings scheduler = BackgroundScheduler(timezone=settings.TIME_ZONE) scheduler.add_jobstore(DjangoJobStore(), "default") ``` 通过这种方式,定时任务执行的时间也将基于正确的时区进行计算和调度[^2]。 ### 检查模板渲染中的时间格式化 在前端模板中,如果使用了 Django 的模板语言来渲染时间字段,可以使用 `{% timezone %}` 标签强制指定时区输出: ```django {% load tz %} {% get_current_timezone as TIME_ZONE %} {% timezone TIME_ZONE %} {{ value|date:"Y-m-d H:i:s" }} {% endtimezone %} ``` 这将确保模板引擎在渲染时间时遵循 Django 设置的时区规则,而不是依赖服务器的本地时区设置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值