工具_Nginx

文章目录

一句话简介:C语言写的an HTTP web server, reverse proxy, content cache, load balancer, TCP/UDP proxy server, and mail proxy server.

2-clause BSD License. 可以商用不开源

官网:https://nginx.org/en/

配置手册:https://nginx.org/en/docs/

nginx是一个主进程外加工作进程,查找nginx特性及配置根据模块进行查找

比如最常见的

location语法介绍

对于location 匹配规则如下

location = /uri     #开头表示精确匹配,只有完全匹配上才能生效。

location ^~ /uri    #开头对URL路径进行前缀匹配,并且在正则之前。

location ~ pattern #开头表示区分大小写的正则匹配。

location ~* pattern #开头表示不区分大小写的正则匹配。

location /uri    #不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。

location / #通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。

多个 location 配置的情况下匹配顺序为

首先精确匹配 = ,如果匹配成功,则停止其他匹配

其次前缀匹配 ^~

其次是按文件中顺序的正则匹配

然后匹配不带任何修饰的前缀匹配。

最后是交给 / 通用匹配

当有匹配成功时候,停止匹配,按当前匹配规则处理请

跨域配置

跨域策略是浏览器的一个保护策略

发起HTTP请求时如果监测到会违反跨域策略,会先发起预检请求(OPTIONS请求),

  • 服务器接收到预检请求后,需要决定是否允许跨域请求。如果允许,服务器的响应中应包含:
    • Access-Control-Allow-Origin:指定允许访问资源的源,可以是具体的域名,也可以是通配符*(但不推荐使用,因为它可能会带来安全风险)。
    • Access-Control-Allow-Methods:列出允许的HTTP方法。
    • Access-Control-Allow-Headers:如果请求中包含自定义头信息,这里需要列出这些头信息的名称。
  • 服务器还可以设置Access-Control-Max-Age头,用来指定预检请求的缓存时间,这样在这段时间内,浏览器不会再次发送预检请求。

正常不配置,直接前端:http://localhost:5500 get请求 http://localhost:8080

No 'Access-Control-Allow-Origin' header is present on the requested resource

json 复制代码
#nginx配置文件中加请求头语法
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';

add_header 'Access-Control-Allow-Credentials' 'true';

#处理浏览器同源策略的预检请求
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}

https配置

json 复制代码
    # HTTPS server
    #
    server {
        listen       443 ssl;  #https默认是443端口
        server_name  localhost;

        ssl_certificate      cert.pem;  # ssl证书文件
        ssl_certificate_key  cert.key; # ssl秘钥文件

        ssl_session_cache    shared:SSL:1m;  
        ssl_session_timeout  5m;

        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;    #可选配置,指定ssl加密算法优先级
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;  #可选配置,指定ssl协议版本
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }

http重定向到https配置

json 复制代码
 rewrite ^(.*)$ https://$host$1 permanent;# 将这条配置添加到http server中即可

或者
return 301 https://$server_name$request_uri;  # 两种配置一种即可

反向代理配置

www.zhengqing520.com/api 转发到http://www.zhengqing520.com:9528/api/

www.zhengqing520.com/blog 转发到http://zhengqingya.gitee.io/blog/

json 复制代码
server {
    listen       80;
    server_name  www.zhengqing520.com;# 服务器地址或绑定域名
 
    location ^~ /api {  # ^~/api 表示匹配前缀为api的请求
        proxy_pass  http://www.zhengqing520.com:9528/api/;  # 注:proxy_pass的结尾有/, -> 效果:会在请求时将/api/*后面的路径直接拼接到后面
  
        # proxy_set_header作用:设置发送到后端服务器(上面proxy_pass)的请求头值  
            # 【当Host设置为 $http_host 时,则不改变请求头的值;
            #   当Host设置为 $proxy_host 时,则会重新设置请求头中的Host信息;
            #   当为$host变量时,它的值在请求包含Host请求头时为Host字段的值,在请求未携带Host请求头时为虚拟主机的主域名;
            #   当为$host:$proxy_port时,即携带端口发送 ex: $host:8080 】
        proxy_set_header Host $host; 
  
        proxy_set_header X-Real-IP $remote_addr; # 在web服务器端获得用户的真实ip 需配置条件①    【 $remote_addr值 = 用户ip 】
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 在web服务器端获得用户的真实ip 需配置条件②
        proxy_set_header REMOTE-HOST $remote_addr;
        # proxy_set_header X-Forwarded-For $http_x_forwarded_for; # $http_x_forwarded_for变量 = X-Forwarded-For变量
    }

    location ^~ /blog/ { # ^~/blog/ 表示匹配前缀为blog/后的请求
        proxy_pass  http://zhengqingya.gitee.io/blog/; 
  
        proxy_set_header Host $proxy_host; # 改变请求头值 -> 转发到码云才会成功
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
    }
}

负载均衡配置

使用ngx_http_upstream_module模块和ngx_http_proxy_module模块

json 复制代码
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream www_server_pools {         #这里定义Web服务器池,包含了251,252两个Web节点

	server 10.43.187.251:80 weight=1;

	server 10.43.187.252:80 weight=1;

	}
    server {            #这里定义代理的负载均衡域名虚拟主机
        listen       80;
        server_name  www.qll.com;
        location / {
		proxy_pass http://www_server_pools;     #访问www.qll.com,请求发送给www_server_pools里面的节点
        }
    }
}

upstream配置

  • server

负载后面的RS配置,可以是ip或者域名。

  • weight

请求服务器的权重。默认值为1,越大表示接受的请求比例越大。

  • max_fails

nginx 尝试连接后端主机失败的次数。

这个数值需配合proxy_net_upstreamfastcgi_next_upstreammemcached_next_upstream这三个参数来使用的。

当nginx接收后端服务器返回这三个参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如404,502,503

  • fail_timeout

max_fails定义的失败次数后,距离下次检查的时间间隔,默认10s

  • backup

热备配置,标志这台服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求

  • down

表示这个服务器永不可用,可配合ip_hash使用

json 复制代码
upstream web_pools {

server linux.example.com weight=5;
server 127.0.0.1:8080 max_fail=5 fail_timeout=10s;
# 当5次连续检查失败后,间隔10s后重新检测。
server linux.example.com:8080 backup;
# 指定备份服务器。作用:等上面服务器全部不可访问时就向它转发请求。

}

负载均衡算法

(1)rr轮询(默认)

默认调度算法,按照客户端请求逐一分配到不同的后端服务器,宕机的服务器会自动从节点服务器池中剔除。

go 复制代码
upstream server_pools {
    server 192.168.1.251;
    server 192.168.1.252;
    }

注意:对于服务器性能不同的集群,该算法容易引发资源分配不合理等问题。

(2)wrr加权轮询(weight)

在rr轮询算法的基础上加上权重,权重和用户访问成正比,权重值越大,被转发的请求也就越多

go 复制代码
upstream server_pools {
    server 192.168.1.251 weight=5;
    server 192.168.1.252 weight=10;
}

加权轮询应用于服务器性能不等的集群中,使资源分配更加合理化。

(3)ip_hash(会话保持)

每个请求按访问 IP 的hash结果分配,每个访客固定访问一个后端服务器,可解决session不共享的问题。

go 复制代码
upstream server_pools {
    ip_hash;
    server 192.168.1.251;
    server 192.168.1.252;
    }

Session 不共享是说,假设用户已经登录过,此时发出的请求被分配到了 A 服务器,但 A 服务器突然宕机,用户的请求则会被转发到 B 服务器。但由于 Session 不共享,B 无法直接读取用户的登录信息来继续执行其他操作。

(4)fair(动态调度算法)

根据后端节点服务器的响应时间来分配请求,响应时间短的优先分配。

go 复制代码
upstream server_pools {
    server 192.168.1.251;
    server 192.168.1.252;
    fair;
    }

这是更加智能的调度算法,但Nginx本身不支持fair调度算法。如果需要使用fair调度,必须下载Nginx相关模块upstream_fair

(5)url_hash算法(web缓存节点)

根据访问URL的hash结果来分配请求,让每个URL定向到同一个后端服务器。

go 复制代码
upstream server_pools {

server qll:9001;
server qll:9002;
hash $request_uri;
hash_method crc32;

}

同样,Nginx本身是不支持url_hash,如果需要使用这种调度算法,必须安装Nginx的hash模块软件包。

相关推荐
Knight_AL2 小时前
Docker 中的端口映射原理:为什么 Nginx 要 `listen 80`,而不是“随便写端口”
nginx·docker·容器
虹梦未来4 小时前
【运维心得】Ubuntu2404编译nginx隐藏Server信息
运维·服务器·nginx
网安_秋刀鱼5 小时前
【java安全】shiro反序列化1(shiro550)
java·开发语言·安全·web安全·网络安全·1024程序员节
tgethe8 小时前
Nginx笔记
运维·笔记·nginx
invicinble8 小时前
对于nginx(一,认识nginx)
运维·nginx
徒手千行代码无bug8 小时前
Nginx upstream 负载均衡 404,单节点转发正常的根因与解决
运维·nginx·负载均衡
irisart9 小时前
第二章【NGINX 开源功能】—— 七层反向代理(下)
运维·nginx
xixiyuguang9 小时前
nginx tar离线安装 ubuntu22.04
运维·nginx
丁丁丁梦涛9 小时前
nginx解决域名代理到IP+端口的平台静态资源和接口地址问题
运维·tcp/ip·nginx
苹果醋310 小时前
24.记录Vue项目iview组件日期获取时间少一天
java·运维·spring boot·mysql·nginx