工具_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模块软件包。

相关推荐
苹果醋32 分钟前
SpringBoot快速入门
java·运维·spring boot·mysql·nginx
永卿0011 小时前
nginx学习总结(不包含安装过程)
运维·nginx·负载均衡
小湿哥5 小时前
ubuntu22.04 nginx配置下载目录,亲测成功
运维·nginx
BUG研究员_16 小时前
LoadBalancer负载均衡和Nginx负载均衡区别理解
nginx·rpc·负载均衡
见欢.17 小时前
Nginx解析漏洞靶场通关(nginx_parsing&CVE-2013-454)
nginx
2401_850410831 天前
LVS简介
运维·nginx·tomcat·lvs
Say-hai1 天前
nginx-rtmp服务器搭建
服务器·nginx·音视频
liuyunshengsir1 天前
Nginx的stream模块代理四层协议TCP的流量转发
运维·tcp/ip·nginx
过过过呀Glik2 天前
在 Ubuntu 上安装 Nginx 的详细指南
nginx·ubuntu
托尼沙滩裤2 天前
【MAC】深入浅出 Homebrew 下 Nginx 的安装与配置指南
运维·nginx·macos