关于近期了解到的nginx使用方法的总结

一、 nginx配置和配置说明

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
worker_processes  1; #启动nginxl时工作进程的数量,可以加大这个数字来提高ginx的处理请求的效率,但是这个数字也不能太大,因
为进程是消耗系统内存资源的。调整一下这个数字,然后通过fre指令可以查看一下内存容量的变化。建议和CPU核数一致就行

events {

worker_connections 1024; #连接数量,每个进程可以处理1024个连接

}

http { #http模块

include mime.types; #include是包含的意思,这行的意思是,nginx启动的时候加载nginx,conf主配置文件的时候,加
载到这一行的时候,先包含加载一下mime.types文件里面的配置,这个文件主要是用来标识支持哪些多媒体格式,这个文件在nginx.conf所在目录


default_type application/octet-stream; #如果有不能识别的文件,那么默认以八进制数据流的方式打开文件
server { #一个网站,一个nginx可以运行多个网站,添加此配置即可
listen 80; #监听端口,可以在0-65535种选择任意端口,前提是你知道哪些端口未被其他服务占用
server_name localhost; #网站的域名或ip地址,默认为localhost

location / {
root html; #站点根目录,可写相对路径或绝对路径
index index.html index.htm; #站点根目录下的文件,若都缺失则反馈403

}

}

}


以上为可维持nginx服务运行的最小配置

二、SSL证书配置

ssl证书(安全套接层证书,Secure Sockets Layer)—— 主要用于加密互联网通信,确保数据传输的安全性

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
server {

​ listen 11451 ssl;

​ listen [::]:11451 ssl;

​ error_page 497 https://$host:11451$request_uri;

​ server_name anzhiyublog.web-nginx.070529.xyz;



​ ssl_certificate D:\anzhiyublog.web-nginx.070529.xyz\anzhiyublog.web-nginx.070529.xyz.crt; # 这个是证书的crt文件所在目录

​ ssl_certificate_key D:\anzhiyublog.web-nginx.070529.xyz\anzhiyublog.web-nginx.070529.xyz.key; # 这个是证书key文件所在目录

​ ssl_session_cache shared:SSL:1m;

​ ssl_session_timeout 5m;

​ #表示使用的加密套件的类型

​ ssl_ciphers HIGH:!aNULL:!MD5;

​ #表示使用的TLS协议的类型,您需要自行评估是否配置TLSV1.1协议。

​ ssl_protocols TLSV1.2 TLSV1.3;

​ ssl_prefer_server_ciphers on;





​ location / {

​ root D:\anzhiyublog.web-nginx.070529.xyz\blog-demo\public;

​ index index.html index.htm;



​ }

}

以上为我个人博客的证书配置

我通过Lucky注册证书

image-20241105130821369

具体注册方法该项目中都有说明

三、反向代理

反向代理(reverse proxy)是指用代理服务器来接受外部的访问请求,然后将请求转发给内网的上游服务器,并将从上游服务器上得到的结果返回外部客户端。作为反向代理是 Nginx 的一种常见用法。

image-20241105131424535

1.upstream:作为反向代理,一般都需要向上游服务器的集群转发请求。upstream 块定义了一个上游服务器的集群,便于反向代理中的 proxy_pass使用。

1
2
3
4
5
6
7
8
http {
...
upstream backend {
server 127.0.0.1:8080;
}
...
}

upstream 定义了一组上游服务器,并命名为 backend

2.proxy_pass:proxy_pass 指令设置代理服务器的协议和地址。协议可以指定 “http “或 “https”。地址可以指定为域名或IP地址,也可以配置为 upstream 定义的上游服务器

1
2
3
4
5
6
7
8
9
10
11
http {
server {
listen 6888;
server_name localhost;

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

3.proxy_set_header:在传递给上游服务器的请求头中,可以使用proxy_set_header 重新定义或添加字段。一般我们使用 proxy_set_header 向上游服务器传递一些必要的信息。

1
2
3
4
5
6
7
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend;
}

上面的配置使用 proxy_set_header 添加了三个 HTTP header

  • Host:Host 是表明请求的主机名。默认情况下,Nginx 向上游服务器发送请求时,请求头中的 Host 字段是上游真实服务器的IP和端口号。如果我们想让传递给上游服务器的 Host 字段,包含的是用户访问反向代理时使用的域名,就需要通过 proxy_set_header 设置 Host 字段,值可以为 $host$http_host,区别是前者只包含IP,而后者包含IP和端口号。

  • X-Real-IP:经过反向代理后,上游服务器无法直接拿到客户端的 ip,也就是说,在应用中使用request.getRemoteAddr() 获得的是 Nginx 的地址。通过 proxy_set_header X-Real-IP $remote_addr;,将客户端的 ip 添加到了 HTTP header中,让应用可以使用 request.getHeader(“X-Real-IP”) 获取客户端的真实ip。

  • X-Forwarded-For:如果配置了多层反向代理,当一个请求经过多层代理到达上游服务器时,上游服务器通过 X-Real-IP 获得的就不是客户端的真实IP了。那么这个时候就要用到 X-Forwarded-For ,设置 X-Forwarded-For 时是增加,而不是覆盖,从客户的真实IP为起点,穿过多层级代理 ,最终到达上游服务器,都会被记录下来。

  1. proxy_cache:Nginx 作为反向代理支持的所有特性和内置变量都可以在 ngx_http_proxy_module 的文档页面找到

image-20241105132001545

其中一个比较重要的特性是 proxy cache,对访问上游服务器的请求进行缓存,极大减轻了对上游服务的压力。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
http {
...
proxy_cache_path /tmp/nginx/cache levels=1:2 keys_zone=myzone:10m inactive=1h max_size=10g use_temp_path=off;
server {
...
location / {
...
proxy_cache myzone;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 302 12h;
}
}
}

  • proxy_cache_path 缓存路径,要把缓存放在哪里
    • levels=1:2:缓存的目录结构
    • keys_zone=myzone:10m:定义一块用于存放缓存key的共享内存区,命名为myzone,并分配 10MB 的内存;配至10MB的zone 大约可以存放 80000个key。
    • inactive=1d:不活跃的缓存文件 1 小时后将被清除
    • max_size=10g:缓存所占磁盘空间的上限
    • use_temp_path=off:不另设临时目录
  • proxy_cache myzone;:代表要使用上面定义的 myzone
  • proxy_cache_key:用于生成缓存键,区分不同的资源。key 是决定缓存命中率的因素之一
    • $host:request header中的 Host字段
    • $uri:请求的uri
    • $is_args 反映请求的 URI 是否带参数,若没有即为空值。
    • $args:请求中的参数
  • proxy_cache_valid:控制缓存有效期,可以针对不同的 HTTP 状态码可以设定不同的有效期。示例针对 200,304,302 状态码的缓存有效期为12小时。

四、同端口http转跳https

默认497错误,是返回 400 Bad Request: The plain HTTP request was sent to HTTPS port
可以修改这个错误处理。 在 server { .. } 中加入一行。

  • error_page 497 https://$host$request_uri; 默认用302,临时重定向
  • error_page 497 =301 https://$host$request_uri; 永久重定向
  • error_page 497 =307 https://$host$request_uri; 临时重定向,不改变请求的方法(如post还是post)

如果重定向后,没有带上正确的端口号,则显式的加上端口号 $server_port

  • error_page 497 https://$host:$server_port$request_uri;

还有一种写法,

  • error_page 497 https://$host:$server_port$uri$is_args$args;

最终写法:

error_page 497 301 =307 https://$host:$server_port$request_uri;

永久重定向,不改变请求的方法(如post还是post)