https://blog.csdn.net/ZYM66/article/details/127714559?spm=1001.2014.3001.5502
之前对于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项目。
如果我们在基层的WebServer上再套一层WebServer的话问题就能迎刃而解。
那么我们网络的拓扑结构就变成了:
这样做有很多优点:
用户通过http/https协议访问Nginx服务器,Nginx会根据域名和负载情况的不同把请求传递给其下方的服务器。Nginx处理请求后会使用uwsgi协议把信息转移到子Server上,子Server内部使用wsgi协议或者uwsgi协议与WebApp进行交流。
我们调节Nginx,主要就是对nginx.conf配置文件的调整,Nginx配置文件的结构如下
user nobody;
worker_processes 4;
error_log /data/nginx/logs/error.log notice;
events {
#每个 work process 支持的最大连接数为 1024.
worker_connections 1024;
}
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
server {
listen 80;
#server_name也支持通配符,*.example.com、www.example.*、.example.com
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
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.html
error_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后进入该server
location / {
# location后边跟路由,/代表根目录
proxy_pass xxxxx # 把请求传递给某个server,xxxxx为子server的名称
}
}
Nginx会持续不断地监听(listen)80端口(http访问的默认端口),如果有符合条件的域名(server_name)和路由(location)命中规则,就会通过内部的转发(proxy_pass )转发到其子Server上。