前言

Nginx是一个Web服务器和反向代理服务器,有着高性能,占用内存低、可扩展性高多功能等等一系列优点

功能:充当反向代理服务器,服务器的负载均衡、支持HTTP/HTTPS协议、内置缓存机制,自由设置缓存时间提高需要时间和减少后端服务器负载、有着安全性:控制访问路径、IP白名单、名单和速率限制。

下载以及初步运行

以Windows为例:

官网下载nginx:下载

因为Nginx初始端口为80,这是所有服务器默认的HTTP端口,在Windows中会被占用从而打不开,首先我们需要修改默认端口,解压Nginx文件夹后打开Nginx路径下的\nginx-1.26.0\conf\nginx.conf

映入眼帘的是如下配置(去除注释外):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#user  nobody;
worker_processes 1;

events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
}
}

其他我们先不管,先把视线放在http->server之中,我们可以看到listen后面跟着80这个数字,listen就是我们想要找到的端口号设置,把这一段修改为任意一个没被占用的端口号即可,我这里修改为90

如下:

1
2
3
4
5
6
7
8
9
10
11
12
 server {
listen 90;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

之后我们打开127.0.0.1:90就能看见默认生成的Nginx页面

默认Nginx

我们注意到server之中还有好几个配置名字,这些都是什么意思呢?

首先看到listen下的server_name,这个起到设置域名或者IP地址的作用,众所周知localhost就是127.0.0.1,所以我们能在27.0.0.1:90访问到Nginx的初始界面。

server_name可以使用域名、IP、通配符、正则表达式、default_server进行匹配,定义服务器的地址,其中default_server修饰是搭配80 或者 443 标记用于指定默认的服务器块,当没有其他服务器块匹配请求的域名时,NGINX将使用这个默认的服务器块 (也可以设置你想展示的默认端口或IP地址 。

接下来就是

1
2
3
4
5
6
7
8
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

location后设置访问的是请求,可以使用正则表达式、通配符、地址、文件等等例如/就是请求网址根目录,/50x.html,就是请求127.0.0.1:90/50x.html{}内的参数root为文件地址,可以是相对路径也可以是绝对地址,index是主页的搜索范围,例如上面的配置中就是在/html/找到index.html或者index.htm

Nginx先判断的并不是请求而是路径,但是可以类似的通过try_files $uri /test.html;把路径变为请求,在下面有讲到…

如果省略后缀名也可以找出来结果

使用=号的时候,会精准匹配某个准确的字符串

我们观察到root 也就是路径写着是html,那么这个html在哪里呢?我们打开Nginx的文件夹中看看

html路径

网址`/`或`/50x.html`

除了这个以外,还有一行error_page 500 502 503 504 /50x.html;,意思是如果发生了 500、502、503、504状态码错误,就跳转到/50x.html界面,用来处理页面错误问题。

了解到这些以后我们来自定义一个配置试试看。

添加配置:

1
2
3
4
5
6
7
8
9
        location /test {
root html;
# index test.html;
try_files $uri /test.html;
}
#此时/test可能会被解析为路径而不是请求,所以需要 try_files
location = /hello.html {
root html;
}

注意!修改配置后需要重启Nginx!!!

try_files 正则表达式或者文件名; 加载查询到的第一个结果

结果如下:

自定义新界面的结果

请求以及缺省后缀名

编码问题不用在意啦…

配置篇

1.站点配置

以我的一个站点配置为例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
server
{
#默认端口号配置,开启了HTTPS SSL
listen 80 default_server;
listen 443 ssl http2 default_server;
listen 端口号;
server_name kiko2568.top xxx.xx.xx.xx;
index index.php index.html index.htm default.php default.htm default.html;
#站点所在目录
root /www/wwwroot/kiko2568.top;
#CERT-APPLY-CHECK--START
# 用于SSL证书申请时的文件验证相关配置 -- 请勿删除
#include 可以引入文件所在的目录下的文件,可以用通配符,正则表达式
include /www/server/panel/vhost/nginx/well-known/kiko2568.top.conf;

#CERT-APPLY-CHECK--END

#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
#HTTP_TO_HTTPS_START
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP_TO_HTTPS_END
ssl_certificate /www/server/panel/vhost/cert/kiko2568.top/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/kiko2568.top/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers xxxxx+xxxxxxxx:xxxxx+xxxxxxxx-xxxxx:xxxxx+xxxxxx:xxx+xxxxxx:xxxxx+xxxxxx:xxxxxxxxxx:xxxxx+xxxx:xSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
#错误界面
error_page 497 https://$host$request_uri;

#SSL-END

#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END

#PHP-INFO-START PHP引用配置,可以注释或修改
include enable-php-80.conf;
#PHP-INFO-END

#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/kiko2568.top.conf;
#REWRITE-END

#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
{
return 404;
}

#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}

#禁止在证书验证目录放入敏感文件
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
#设置静态资源缓存过期时间 和日志
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
#设置js||css 文件缓存过期时间 和日志
location ~ .*\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
#日志存放记录
access_log /www/wwwlogs/kiko2568.top.log;
error_log /www/wwwlogs/kiko2568.top.error.log;
}

Nginx服务器配置

这里我直接转载Nginx 配置详解 | 菜鸟教程 (runoob.com)

他写的好详细!!!

小小偷个懒

目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
...              #全局块

events { #events块
...
}

http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
  • 1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  • 2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  • 3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  • 4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
  • 5、location块:配置请求的路由,以及各种页面的处理情况。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1 可设置 auto
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。

upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}

上面是nginx的基本配置,需要注意的有以下几点:

1、几个常见配置项:

  • 1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
  • 2.$remote_user :用来记录客户端用户名称;
  • 3.$time_local : 用来记录访问时间与时区;
  • 4.$request : 用来记录请求的url与http协议;
  • 5.$status : 用来记录请求状态;成功是200;
  • 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
  • 7.$http_referer :用来记录从那个页面链接访问过来的;
  • 8.$http_user_agent :记录客户端浏览器的相关信息;

2、惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。

3、每个指令必须有分号结束。


代理、正向代理以及反向代理

代理:通过第三方(第一第二方为服务器端和客户端)服务器来进行代理,让服务器端和客户端不直接碰面,从而成功请求响应数据。

正向代理:

forward proxy

代理的是客户端,去和服务器端交互

客户端给代理服务器发送请求,由代理服务器转发给服务器端,并把响应的内容转发回客户端

用处:

  • 突破访问限制

    类似vpn,使用不属于本地网络来访问不能访问的地方

  • 提高访问速度

    通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。

  • 隐藏客户端真实IP

    服务器端交互 的是代理服务器而不是客户端,起到了隐藏的作用

反向代理:

reverse proxy

代理的是服务器端,去和客户端交互

作为伪装的服务器端接受请求把请求转发给服务器端,并假装服务器端把真正的服务器响应的数据给客户端

用处:

  • 隐藏服务器真实IP
    使用反向代理,可以对客户端隐藏服务器的IP地址。
  • 负载均衡
    反向代理服务器可以做负载均衡,根据所有真实服务器的负载情况,将客户端请求分发到不同的真实服务器上。
  • 提高访问速度
    反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度。
  • 提供安全保障
    反向代理服务器可以作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等。还可以为后端服务器统一提供加密和SSL加速(如SSL终端代理),提供HTTP访问认证等。

Nginx设置代理

设置 404 页面导向地址

1
2
error_page 404 https://www.error.com; #错误页
proxy_intercept_errors on; #如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off。

如果我们的代理只允许接受get,post请求方法的一种

1
proxy_method get;    #支持客户端的请求方法。post/get;

设置支持的http协议版本

1
proxy_http_version 1.0 ; #Nginx服务器提供代理服务的http协议版本1.0,1.1,默认设置为1.0版本

设置HTTP2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 443 ssl http2; #设置前端2.0 443接口支持 http2以及SSL
server_name example.com;

ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;

location / {
proxy_pass http://backend;
proxy_http_version 1.1; #后端还是1.1
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

upstream backend {
server backend1.example.com;
server backend2.example.com;
}

在 Nginx 配置中,即使前端使用的是 HTTP/2,与后端服务器的通信通常仍然使用 HTTP/1.1。原因在于,HTTP/2 的主要优点(如多路复用、头部压缩和服务器推送)主要体现在客户端和 Nginx 之间的通信中。Nginx 作为反向代理服务器,可以将前端的 HTTP/2 请求转换为后端的 HTTP/1.1 请求,这样可以确保与后端服务器的兼容性和稳定性。

负载均衡时,某服务器超时/连接失败 时不再请求

例如有俩个服务器A,B,B连接不上了,这个时候再发送给B请求就会超时,等待响应时间长,才把重新请求发给A,可以断开链接

1
2
3
4
proxy_connect_timeout 1;   #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_ignore_client_abort on; #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。

负载均衡时设置异常情况切换下一个服务器

如果使用upstream指令配置一组服务器作为被代理服务器,服务器中的访问算法遵循配置的负载均衡规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一组服务器处理。

1
proxy_next_upstream timeout;  #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。

状态值可以是:

  • error:建立连接或向被代理的服务器发送请求或读取响应信息时服务器发生错误。
  • timeout:建立连接,想被代理服务器发送请求或读取响应信息时服务器发生超时。
  • invalid_header:被代理服务器返回的响应头异常。
  • off:无法将请求分发给被代理的服务器。
  • http_400,http_500|http_502|http_503|http_504|http_404….:被代理服务器返回的状态码为400,500,502,等。

获取客户端真实信息而不是代理服务器

1
2
3
4
proxy_set_header Host $host; #只要用户在浏览器中访问的域名绑定了 VIP VIP 下面有RS;则就用$host ;host是访问URL中的域名和端口  www.taobao.com:80
proxy_set_header X-Real-IP $remote_addr; #把源IP 【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP;这样在代码中 $X-Real-IP来获取 源IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用 【,】隔开;代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源IP
proxy_set_header X-Forwarded-Proto $scheme; #将客户端使用的协议(http 或 https)传递给后端服务器。

反向代理:

和下面的负载均衡一样

1
2
3
location / {
proxy_pass http://127.0.0.1:8080;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
upstream backend {
server backend1.example.com;
server backend2.example.com;
server 0.0.0.1;
#....还可以再加
}

server {
listen 80;

location / {
proxy_pass http://backend;
}
}

基本示例:

1
2
3
location /api/ {
proxy_pass http://localhost:8080/admin/;
}

一张图解释


配置大全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
include       mime.types;   #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat ' $remote_addr$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
proxy_connect_timeout 1; #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_http_version 1.0 ; #Nginx服务器提供代理服务的http协议版本1.0,1.1,默认设置为1.0版本。
#proxy_method get; #支持客户端的请求方法。post/get;
proxy_ignore_client_abort on; #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。
proxy_ignore_headers "Expires" "Set-Cookie"; #Nginx服务器不处理设置的http相应投中的头域,这里空格隔开可以设置多个。
proxy_intercept_errors on; #如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off。
proxy_headers_hash_max_size 1024; #存放http报文头的哈希表容量上限,默认为512个字符。
proxy_headers_hash_bucket_size 128; #nginx服务器申请存放http报文头的哈希表容量大小。默认为64个字符。
proxy_next_upstream timeout; #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
#proxy_ssl_session_reuse on; 默认为on,如果我们在错误日志中发现“SSL3_GET_FINSHED:digest check failed”的情况时,可以将该指令设置为off。

负载均衡

用户多的时候,执行业务处理中的服务器免不了高并发,如果只有一个服务器,那么可能导致响应速度慢业务堵塞服务器崩溃等等不好的后果。所以一般会由多个服务器进行业务处理,降低每个服务器的压力。

具体使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
server 0.0.0.1;
#....还可以再加
}

server {
listen 80;

location / {
proxy_pass http://backend;
#相当与 http://backend1.example.com
#或者 http://backend2.example.com
#或者 http://0.0.0.1
# 复制粘贴upstream 的server
}
}
}

这样,服务器就有原本的一个服务器支撑业务就变为多个服务器一起进行

轮询 (Round Robin):

默认的算法:例如设置了三个服务器进行负载均衡,则按照顺序一个一个轮流分配请求到每个后端服务器。

例如a、b、c为三个服务器 的编号,现在有一连串的请求到Nginx,那么分配顺序就是:abc abc abc abc abc

权重 (Weight):

1
2
3
4
5
upstream backend {
server backend1.example.com weight=3;
server backend2.example.com weight=2;
server 0.0.0.1 weight=1;
}

设置方法就是在IP地址后面加上 weight= 权重值 ,不设置默认为1

如代码所示,a、b、c的权重为3、2、1那么一串请求进入的分配结果为:

aaabbc aaabbc aaabbc

IP 哈希 (IP Hash):

根据客户端 IP 地址的哈希值来分配请求,这样来自同一个客户端的请求会始终被分配到同一个后端服务器。

1
2
3
4
5
6
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server 0.0.0.1 ;
}

请求的session就不怕被分配到其他的服务器了。

热备(backup)

设置某个 服务器 做当作备用,当全部服务器都故障了,就使用这个备用服务器。

1
2
3
4
upstream mysvr { 
server backend2.example.com;
server 0.0.0.1 backup; #热备
}

加入a、b是编号,b是热备,那么请求是这样的aaaaaaaaaa,a 故障了,bbbbbbbbb。

健康检查 (Health Check):

为了确保请求只被分配到正常运行的服务器,可以配置健康检查。

1
2
3
4
5
6
7
8
upstream backend {
least_conn;
server backend1.example.com weight=3;
server backend2.example.com weight=2;
server 0.0.0.1 weight=1;

health_check interval=10s fails=3 passes=2;
}

三个参数为:

  • interval=10s:
    表示健康检查的时间间隔,即每 10 秒对每个上游服务器进行一次健康检查。

  • fails=3:
    表示在标记服务器为不可用之前必须连续失败的健康检查次数。如果服务器连续 3 次健康检查失败,那么它将被认为是不可用的。

  • passes=2:
    表示在将服务器标记为可用之前必须连续成功的健康检查次数。如果服务器被标记为不可用,但之后连续 2 次健康检查成功,那么它将被重新标记为可用。

最少连接 (Least Connections):

将请求分配给当前活动连接数最少的服务器,适用于请求处理时间较长的场景。

1
2
3
4
5
6
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
server 0.0.0.1;
}

其他配置

  • down,表示当前的server暂时不参与负载均衡。
  • backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
  • max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
  • fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。

例如:

1
2
3
4
upstream mysvr { 
server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;
}

参考

Nginx 反向代理与负载均衡详解 | 菜鸟教程 (runoob.com)

深入理解 http 反向代理(nginx) - 知乎 (zhihu.com)

运维排查篇 | 访问nginx出现403错误 - 知乎 (zhihu.com)

终于有人把正向代理和反向代理解释的明明白白了!-腾讯云开发者社区-腾讯云 (tencent.com)

写给Web开发人员看的Nginx介绍_ngnix和服务器语言-CSDN博客