当前位置: 首页 > news >正文

Django + Nginx https部署实战(第一辑)

WebServer和WebAPP

之前对于nginx的了解都只是听说,根本就不知道nginx对于整个网站的作用。经历了数个项目之后,我本人逐渐对nginx有了更深入的了解,也希望把这段经历拿出来分享给大家!

由于我本人之前接触的都是Python的Django后端开发,那么现在我也就以Django为例来说明Nginx的作用。
学过Django的人都知道,我们使用一条名叫

python manager.py runserver 8000

的指令来运行我们的Django项目,可是很多人都不知道这句话背后到底干了什么,我先把这个点讲明白。

  • Django作为一个比较大型的框架,其内部集成了Web服务器,我们编写的Django呢就相当于是Web应用。我们想使用Web应用中提供的服务,必须有一个Web服务器来为我们“指路”,只有这样我们才能与Web应用连接,找到我们想要的服务。

他们之间的关系如下图所示请添加图片描述
我们使用指令打开的是Django内置的Web服务器。这个服务器呢,如果用来测试的话完全够用了,但是如果面对真正要上线的网站就完全不够用了,我们通常使用uvicorn等WebServer来运行我们的web项目。

  • 我们这里就能看见,一个基于python项目的WebServer仅仅只能运行在一个项目上。如果我们的项目真正面向大众了,同时几千万的访问对一台服务器来说是肯定吃不消的。但是如果这时候只使用uvicorn这种比较低级WebServer,那用户在访问的时候还要手动选择要访问的服务器,这显然是我们不愿意看到的情况。不仅仅用户体验非常差,而且服务器也有较大的风险。

如何解决这个问题呢?

如果我们在基层的WebServer上再套一层WebServer的话问题就能迎刃而解。
那么我们网络的拓扑结构就变成了:
请添加图片描述
这样做有很多优点:

  1. 用户不用挑选要访问的服务器,只需要访问第一级的WebServer就可以了
  2. 第一级的WebServer会根据用户访问的域名不同,分配到正确的Web服务器上
  3. 同一个网站可以部署在多个服务器上,一级服务器可以根据每台服务器的负载情况把请求分配合适的服务器处理

在Django+Nginx的项目中,拓扑结构是这样的:

请添加图片描述
用户通过http/https协议访问Nginx服务器,Nginx会根据域名和负载情况的不同把请求传递给其下方的服务器。Nginx处理请求后会使用uwsgi协议把信息转移到子Server上,子Server内部使用wsgi协议或者uwsgi协议与WebApp进行交流。

从Nginx配置开始一整套部署

我们调节Nginx,主要就是对nginx.conf配置文件的调整,Nginx配置文件的结构如下

  1. 全局块
    全局配置部分用来配置对整个server都有效的参数。主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
user nobody;
worker_processes  4;
error_log  /data/nginx/logs/error.log  notice;
  1. events块
    events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
events {
#每个 work process 支持的最大连接数为 1024.worker_connections  1024;
}
  1. http块(最重要)
    这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http 块也可以包括 http全局块、server块。

细说配置文件的http块

1.http全局块

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

http {include       mime.types;default_type  application/octet-stream;
sendfile        on;
keepalive_timeout  65;

2. server块(重中之重)

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

  • 全局server块
server {listen       80;#server_name也支持通配符,*.example.com、www.example.*、.example.comserver_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;
  • location块(类似于Django的路由)
    这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

location 指令说明:
该指令用于匹配 URL。
语法如下:location [ = | ~ | ~* | ^~] uri{}
?> Tip 注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。
当一个请求进入时,URI将会被检测匹配一个最佳的location。

 location / {root   html;index  index.html index.htm;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.htmlerror_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}location / {#try_files指令将会按照给定的参数顺序进行匹配尝试try_files $uri $uri/ /index.html;}

项目的反向代理设置

# 配置http块内的server块
server {listen 80;   # 监听80端口的访问server_name  localhost;  # 检测访问进来的域名(里边可以填入域名),符合server_name后进入该serverlocation  / {# location后边跟路由,/代表根目录proxy_pass xxxxx  # 把请求传递给某个server,xxxxx为子server的名称}
}

Nginx会持续不断地监听(listen)80端口(http访问的默认端口),如果有符合条件的域名(server_name)和路由(location)命中规则,就会通过内部的转发(proxy_pass )转发到其子Server上。

那么第一辑就写到这里,以后会继续给大家更新第二辑

相关文章:

一机游领航旅游智慧化浪潮:借助前沿智能设备,革新旅游服务效率,构建高效便捷、生态友好的旅游服务新纪元,开启智慧旅游新时代

目录 一、引言 二、一机游的定义与特点 (一)一机游的定义 (二)一机游的特点 三、智能设备在旅游服务中的应用 (一)旅游前的信息查询与预订支付 (二)旅游中的导航导览与互动体…...

可持久化 树

Nityacke 的部分没多少,主要是 lxl 的部分可持久化可持久化线段树注意到 这里的内容 可能包括了 狭义的 可持久化线段树,可持久化权值线段树,”主席树“,可持久化 \(Trie\)...Luogu P3919 【模板】可持久化线段树 1(可持久化数组) 特定版本 单点修改,特定版本 单点查询,…...

WPF 窗体高度跟随内容调整

1、宽度和高度调整<Window SizeToContent="WidthAndHeight"></Window> 2、高度调整<Window SizeToContent="Height"></Window> 3、宽度调整<Window SizeToContent="Width"></Window>...

西班牙语剧

https://hadan8490.blogspot.com/...

sql server 数据库的学习

前言&#xff1a; SQL Server是由微软公司开发的一种关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;用于存储和检索数据。它提供了一个可扩展的、安全的和可靠的数据存储和管理解决方案&#xff0c;并主要用于构建企业级应用程序。SQL Server支持使用SQL&…...

中间件之异步通讯组件RabbitMQ入门

一、概述 微服务一旦拆分&#xff0c;必然涉及到服务之间的相互调用&#xff0c;目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中&#xff0c;调用者发起请求后需要等待服务提供者执行业务返回结果后&#xff0c;才能继续执行后面的业务。也就是说调用者在调用…...

Django + Nginx https部署实战(第一辑)

WebServer和WebAPP 之前对于nginx的了解都只是听说&#xff0c;根本就不知道nginx对于整个网站的作用。经历了数个项目之后&#xff0c;我本人逐渐对nginx有了更深入的了解&#xff0c;也希望把这段经历拿出来分享给大家&#xff01; 由于我本人之前接触的都是Python的Django…...

Pycharm+服务器运行代码

Pycharm服务器运行代码服务器的连接与Anaconda环境配置ssh连接安装Anaconda创建虚拟环境安装代码所需的库Pycharm上传代码到服务器服务器的连接与Anaconda环境配置 ssh连接 我使用的是MobaXterm&#xff0c;新建一个会话&#xff0c;选择SSH&#xff0c;输入主机IP地址自己的…...

【Spring】IDEAspring-mybatis的整合----关于配置文件的整合

文章目录spring-mybatis的整合过程步骤1.导包&#xff0c;spring的jar包&#xff0c;mybatis的jar包2.mybatis.xml配置3.spring-mybatis.xml配置4.dao、service层、代码测试spring-mybatis的整合过程步骤 1.导包&#xff0c;spring的jar包&#xff0c;mybatis的jar包 <!--统…...

ssm技术

ssm ssm框架配置 maven项目–》webquickstart pom文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…...

MQ消息队列

MQ消息队列 消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;&#xff0c;指保存消息的一个容器&#xff0c;本质是个队列 消息队列是大型分布式系统不可缺少的中间件&#xff0c;也是高并发系统的基石中间件 使用消息队列还可以实现异步处理 下图便是消息…...

【JVM技术专题】精心准备了一套JVM分析工具的锦囊「JConsole补充篇」

前提概要 本篇文章主要针对于之前本系列文章的补充版&#xff0c;之前落下了Jconsole分析工具&#xff0c;所以为了了却这个遗憾&#xff0c;所以小编又开了这篇文章&#xff0c;主要针对于Jconsole工具进行相关的应用性能分析。 初识JConsole 【Jconsole&#xff08;Java Moni…...

基于PHP的高效协同办公管理系统

有需要请私信或看评论链接哦 可远程调试 基于PHP高效协同办公管理系统一 介绍 高效协同办公管理系统基于Yii框架开发&#xff0c;数据库mysql&#xff0c;可以稳定用于商业以及门户级的开发和使用。 二 系统功能 用户 1 办公门户(邮件/日志/汇报/日程/信息中心/通知公告/微博…...

第十四届蓝桥杯(Web应用开发)模拟赛1期-大学组

数据类型检测 请看这篇数据类型检测 渐变色背景生成器 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name&…...

【遥感科学】遥感科学绪论

第一章 绪论 本系列适用于梅安新老师的遥感导论复习&#xff0c;也可以作为遥感领域的快速入门文章 一、遥感的基本概念 啥子是遥感&#xff1f;借用童庆禧院士的理解&#xff0c;那就是欲穷千里目&#xff0c;更上一层楼&#xff0c;遥感可以看做人的眼睛或者感知的延伸&…...

Tensorflow图像识别 Tensorflow手写体识别(二)

资源介绍 我们从 MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges 这条链接&#xff08;MNIST官网&#xff09;中下载好数据集&#xff0c;如下&#xff1a; 下载下来以后整理成包含四个压缩包的文件MNIST_data&#xff08;不要解压&#x…...

盘点上海IB国际学校,你会选哪一所呢?

之前&#xff0c;小编给大家盘点了上海热门的AP学校和Alevel学校&#xff0c;同时也介绍了国际课程的具体情况&#xff1b;今天就和大家聊聊上海的IB国际学校。IB即是国际文凭组织IBO(International Baccalaureate Organisation)为全球学生开设从幼儿园到大学预科的课程&#x…...

PotatoPie 4.0 实验教程(32) —— FPGA实现摄像头图像浮雕效果

什么是浮雕效果&#xff1f; 浮雕效果是一种图像处理技术&#xff0c;用于将图像转换为看起来像浮雕一样的效果&#xff0c;给人一种凸起或凹陷的立体感觉&#xff0c;下面第二张图就是图像处理实现浮雕效果。 不过这个图是用Adobe公司的PS人工P图实现的&#xff0c;效果比较…...

分享三款可以给pdf做批注的软件

PDF文件不像Word一样可以直接编辑更改&#xff0c;想要在PDF文件上进行编辑批注需要用到一些专业的软件&#xff0c;我自己常用的有三款&#xff0c;全都是官方专业正版的软件&#xff0c;功能丰富强大&#xff0c;使用起来非常方便&#xff01; 1.edge浏览器 这个浏览器不仅可…...

SpringBoot-@Transactional注解失效

Transactional注解失效 Transactional失效场景 以下是一些常见导致Transactional注解失效的场景&#xff0c;配合相应的Java代码演示&#xff1a; 1、方法修饰符非公开&#xff08;非public&#xff09; Transactional注解失效的原因在于Spring事务管理器如何实现对事务的代…...

介绍一下mybatis的基本配置(mybatis-config.xml)

src/main/resources/mybatis-config.xml 这句代码&#xff0c;是XML的声明&#xff0c;它指定了&#xff0c;XML的版本 和 编码方式 <?xml version"1.0" encoding"UTF-8" ?>这句代码&#xff0c;声明了XML文档类型&#xff0c;它告诉解析器&#x…...

Django运行不提示网址问题

问题描述&#xff1a;运行django项目不提示网址信息&#xff0c;也就是web没有起来&#xff0c;无法访问。 (my-venv-3.8) PS D:\Project\MyGitCode\public\it_blog\blog> python .\manage.py runserver INFO autoreload 636 Watching for file changes with StatReloader …...

Java IO流(三)

1. 字符流 1.1 什么是字符流 在Java中&#xff0c;字符流是指提供了基于字符的I/O能力的API。 Java 1.0中提供的基于字节的I/O流API只能支持8位字节流&#xff0c;无法妥善地处理16位Unicode字符。由于需要支持Unicode处理国际化字符&#xff0c;因此Java 1.1 对基础流式I/O库…...