django(三)django配置支持nginx访问

简介: 我正在参加「掘金·启航计划」VUE3.0版本发布,按照之前的计划,博客前端的页面打算使用VUE3.0重新编写。目前后端使用的是PHP的web框架thinkphp5.0,新版的博客后端打算使用python的web框架django。目前我的服务器使用的环境是lnmp(centos+nginx+mariadb+php),因此运行django框架的时候,我选择使用nginx + uwsgi我的服务器使用的是阿里云的centos7.8运行原理如下图所示:一:技术扩展WSGIWSGI 是 Web Server Gateway Interface 的缩写。以层的角度来看,WSGI 所在层的位置低

我正在参加「掘金·启航计划」

VUE3.0版本发布,按照之前的计划,博客前端的页面打算使用VUE3.0重新编写。目前后端使用的是PHP的web框架thinkphp5.0,新版的博客后端打算使用python的web框架django。

目前我的服务器使用的环境是lnmp(centos+nginx+mariadb+php),因此运行django框架的时候,我选择使用nginx + uwsgi

我的服务器使用的是阿里云的centos7.8

运行原理如下图所示:

image.png

image.png

一:技术扩展WSGI

WSGI 是 Web Server Gateway Interface 的缩写。以层的角度来看,WSGI 所在层的位置低于 CGI。但与 CGI 不同的是 WSGI 具有很强的伸缩性且能运行于多线程或多进程的环境下,这是因为 WSGI 只是一份标准并没有定义如何去实现。实际上 WSGI 并非 CGI,因为其位于 web 应用程序与 web 服务器之间,而 web 服务器可以是 CGI。可以理解为是 Python 内置的一个测试 web 服务器。

uWSGI 是一个Web服务器,它实现了 WSGI 协议、uwsgi、http 等协议。Nginx 中HttpUwsgiModule 的作用是与 uWSGI 服务器进行交换。WSGI 是一种 Web 服务器网关接口。比如把 HTTP 协议转化成 WSGI 协议,让 Python 可以直接使用。

二、uWSGI 安装配置

安装

复制代码

sudo pip3 install uwsgi

测试

创建 test.py 文件

python

复制代码

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
return [b'Hello World']

通过 uWSGI 运行该文件

bash

复制代码

uwsgi --http :8000 --wsgi-file test.py # 这里需要注意确保你的8000端口是对外开放的

在浏览器中输入  你的服务器ip:8000,出现 “Hello World”表示安装成功。

三:Nginx、uWSGI、Django 之间的通信

安装Django框架请移步《django(一)ubuntu18.04安装框架

1:配置 Django 和 uWSGI

我的项目 目录是:

bash

复制代码

/usr/local/download/django-master/helloworld

在当前目录下创建文件uwsgi.ini

ini

复制代码

[uwsgi]
#套接字方式--使用nginx连接时使用,后面是Django程序所在服务器地址
socket = :8000
#http通信方式--直接做web服务器使用,后面是Django程序所在服务器地址
# http=192.168.0.214:8000
#配置当前工作的项目目录
chdir = /usr/share/nginx/html/moolsPython
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file = moolsPython/wsgi.py
# 进程数
processes = 8
# 线程数
threads = 2
# 开启主进程模式--uwsgi服务器的角色   uwsgi做主进程,关闭该进程其他相关进程也会被杀掉
master = True
# 存放进程编号的文件
pidfile = uwsgi.pid
# 后台运行,并输出日志,后面是日志文件位置,后台运行时看不见终端所以只能查看日志
daemonize = uwsgi.log
module = moolsPython.wsgi

这个配置,其实就相当于在上一小节中通过 wsgi 命令,后面跟一堆参数的方式,给文件化了。

socket: 指定项目执行的端口号。

chdir: 指定项目的目录。

module: module = hello.wsgi 可以这么来理解。对于 uwsgi.ini 文件而言,与它同级目录有一个 helloworld目录,这个目录下有一个 wsgi.py 文件。

此时 Django 项目的目录文件结构如下:

markdown

复制代码

helloworld/
├── manage.py
├── helloworld
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   └── settings.cpython-36.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── uwsgi.ini

接下来,通过 uwsgi 命令读取 uwsgi.ini 文件启动项目(在项目根目录下运行)

css

复制代码

uwsgi --ini uwsgi.ini

运行结果:

scss

复制代码

setup@labideas-data:~/myweb$ uwsgi --ini uwsgi.ini
[uWSGI] getting INI configuration from uwsgi.ini
*** Starting uWSGI 2.0.17 (64bit) on [Tue Mar 20 11:11:30 2018] ***
compiled with version: 5.4.0 20160609 on 19 March 2018 09:13:12
os: Linux-4.4.0-105-generic #128-Ubuntu SMP Thu Dec 14 12:42:11 UTC 2017
nodename: labideas-data
machine: x86_64
clock source: unix
detected number of CPU cores: 4
current working directory: /home/setup/hello
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
chdir() to /home/setup/hello
your processes number limit is 64049
your memory page size is 4096 bytes
detected max file descriptor number: 65535
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to TCP address :8888 fd 3
Python version: 3.5.2 (default, Nov 23 2017, 16:37:01)  [GCC 5.4.0 20160609]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x1f73aa0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 364520 bytes (355 KB) for 4 cores
*** Operational MODE: preforking ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x1f73aa0 pid: 7097 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 7097)
spawned uWSGI worker 1 (pid: 7099, cores: 1)
spawned uWSGI worker 2 (pid: 7100, cores: 1)
spawned uWSGI worker 3 (pid: 7101, cores: 1)
spawned uWSGI worker 4 (pid: 7102, cores: 1)

注意查看uwsgi的启动信息,如果有错,就要检查配置文件的参数是否设置有误。

2: 配置 Nginx

我的nginx配置文件在/usr/local/nginx/conf目录下。

ini

复制代码

server {
    listen          80; #  指定的是 nginx 代理 uwsgi 对外的端口号。
    server_name     moolspy.mools.net  # 网站域名
    charset         UTF-8;
    # access_log      /var/log/nginx/myweb_access.log;
    # error_log       /var/log/nginx/myweb_error.log;
    client_max_body_size 75M;
    location / {
        include uwsgi_params; # 配置nginx支持uwsgi
        uwsgi_pass 127.0.0.1:8000; # 指的是本机 IP 和端口号,并且要与 helloworld目录下uwsgi.ini 配置文件中的 IP 和端口号必须保持一致。
        uwsgi_connect_timeout 60s; # 链接时间  最大不能超过75s
        uwsgi_read_timeout 120s; # nginx等待uwsgi进程发送响应数据的超时时间 默认 60s
        uwsgi_send_timeout 120s; # nginx向uwsgi进程发送请求的超时时间 默认 60s
    }  
}

重新启动nginx。

在django根目录下运行:

css

复制代码

uwsgi --ini uwsgi.ini

在浏览器中访问你刚刚在nginx中配置的域名,出现如下图所示:说明配置成功:

image.png

3:设置uWSGI开机自启

打开 sudo vi /etc/rc.local 将

arduino

复制代码

uwsgi --ini /home/setup/myweb/uwsgi.ini &

添加到文件中

注意要添加到 exit 0 之前,& 表示该服务是在后台执行。

4:更新代码没有效果

Django + uwsgi + nginx 这个组合在正常访问是没有问题的,但是在你更新完代码之后他并不会立即生效。你需要kill掉uwsgi所有的进程,再重新启动uwsgi才可以。

bash

复制代码

killall -9 uwsgi # 杀死uwsgi进程
uwsgi -i uwsgi.ini & # 重启uwsgi

有好的建议,请在下方输入你的评论。

目录
相关文章
|
3月前
|
编解码 应用服务中间件 Linux
centos配置nginx-rtmp实现ffmpeg转码rtsp为rtmp视频流
centos配置nginx-rtmp实现ffmpeg转码rtsp为rtmp视频流
336 1
|
6月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
260 1
|
3月前
|
Ubuntu 安全 应用服务中间件
详细指南:配置Nginx服务器在Ubuntu平台上
以上步骤涵盖了基本流程:从软件包管理器获取 Ngnix, 设置系统服务, 调整UFW规则, 创建并激活服务器块(也称作虚拟主机), 并进行了初步优化与加固措施。这些操作都是建立在命令行界面上,并假设用户具有必要权限(通常是root用户)来执行这些命令。每个操作都有其特定原因:例如,设置开机启动确保了即使重启后也能自动运行 Ngnix;而编辑server block则定义了如何处理进入特定域名请求等等。
275 18
|
3月前
|
Ubuntu 安全 应用服务中间件
详细指南:配置Nginx服务器在Ubuntu平台上
以上步骤涵盖了基本流程:从软件包管理器获取 Ngnix, 设置系统服务, 调整UFW规则, 创建并激活服务器块(也称作虚拟主机), 并进行了初步优化与加固措施。这些操作都是建立在命令行界面上,并假设用户具有必要权限(通常是root用户)来执行这些命令。每个操作都有其特定原因:例如,设置开机启动确保了即使重启后也能自动运行 Ngnix;而编辑server block则定义了如何处理进入特定域名请求等等。
345 17
|
4月前
|
数据建模 应用服务中间件 PHP
配置nginx容器和php容器协同工作成功,使用ip加端口的方式进行通信
本示例演示如何通过Docker挂载同一宿主目录至Nginx与PHP容器,实现PHP项目运行环境配置。需注意PHP容器中监听地址修改为0.0.0.0:9000,并调整Nginx配置中fastcgi_pass指向正确的IP与端口。同时确保Nginx容器中/var/www/html权限正确,以避免访问问题。
配置nginx容器和php容器协同工作成功,使用ip加端口的方式进行通信
|
5月前
|
应用服务中间件 网络安全 nginx
配置Nginx以支持Websocket连接的方法。
通过上述配置,Nginx将能够理解WebSocket协议的特殊要求,代理Websocket流量到合适的后端服务器。注意,Websocket并不是HTTP,尽管它最初是通过HTTP请求启动的连接升级,因此保证Nginx了解并能够妥善处理这种升级流程是关键。
1153 10
|
5月前
|
存储 前端开发 应用服务中间件
Django 实战:静态文件与媒体文件从开发配置到生产部署
Django项目中,静态文件(Static Files)和媒体文件(Media Files)是两类不同用途的文件。本文详细介绍了它们的区别、配置方法以及在开发与生产环境中的处理方式,并结合用户头像上传功能进行实战演示,最后讲解了如何通过Nginx或OpenResty部署静态与媒体文件服务。
270 1
|
4月前
|
Ubuntu 应用服务中间件 Linux
在Ubuntu上配置Nginx实现开机自启功能
至此,Nginx应该已经被正确地设置为开机自启。在Ubuntu中利用 `systemd`对服务进行管理是一种高效的方式,为系统管理员提供了强大的服务管理能力,包括但不限于启动、停止、重启服务,以及配置服务的开机自启动。通过这些简洁的命令,即使是对Linux不太熟悉的用户也能轻松地进行配置。
189 0
|
6月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
265 1
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
689 45