Nginx
Nginx配置文件详解 - 图1

Nginx安装

Nginx安装完成,没有sbin目录

cd进入到nginx-1.18.0目录内执行

  1. [root@centos7 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx
  2. [root@centos7 nginx-1.18.0]# make
  3. [root@centos7 nginx-1.18.0]# make install

ps:–prefix=path 定义一个目录,存放服务器上的文件 ,也就是nginx的安装目录,默认使用 /usr/local/nginx
这步会看到local目录下有一个跟安装的nginx1.12.2同级的nginx目录,里面就有sbin目录了。

基础指令

listen

该指令用于配置网络监听。
1 listen *:80 | *:8080 #监听所有80端口和8080端口
2 listen IP_address:port #监听指定的地址和端口号
3 listen IP_address #监听指定ip地址所有端口
4 listen port #监听该端口的所有IP连接

server_name

该指令用于虚拟主机的配置。
a. 基于名称的虚拟主机配置

  1. server_name name ...;

b. 基于 IP 地址的虚拟主机配置

  1. server_name 192.168.1.1
  2. location

该指令用于匹配 URL。
location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。

location的语法

=开头表示精确匹配
如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
^~ 开头表示uri以某个常规字符串开头,不是正则匹配
~ 开头表示区分大小写的正则匹配;
~* 开头表示不区分大小写的正则匹配
/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到

Location正则案例

  1. #精确匹配,/后面不能带任何字符
  2. server {
  3. listen 80;
  4. server_name www.itmayiedu.com;
  5. #精确匹配,注解后面不能带任何字符
  6. location =/ {
  7. proxy_pass http://127.0.0.1:8080;
  8. index index.html index.htm;
  9. }
  10. }
  11. #匹配所有以/开头请求
  12. server {
  13. listen 80;
  14. server_name www.itmayiedu.com;
  15. #匹配所有以/开头请求
  16. location / {
  17. proxy_pass http://127.0.0.1:8080;
  18. index index.html index.htm;
  19. }
  20. }
  21. ### 以开头/itmayiedu_8080拦截 默认开启不区分大小写
  22. server {
  23. listen 80;
  24. server_name www.itmayiedu.com;
  25. ### 以开头/itmayiedu_8080 最终跳转到http://127.0.0.1:8080/;
  26. location /itmayiedu_8080/ {
  27. proxy_pass http://127.0.0.1:8080/;
  28. index index.html index.htm;
  29. }
  30. ### 以开头/itmayiedu_8080 最终跳转到http://127.0.0.1:8081/;
  31. location /itmayiedu_8081/ {
  32. proxy_pass http://127.0.0.1:8081/;
  33. index index.html index.htm;
  34. }
  35. }
  36. ### 开头区分大小写

proxy_pass

该指令用于设置被代理服务器的地址。可以是主机名称、IP地址加端口号的形式。
语法结构如下:

  1. proxy_pass URL;
  2. index

该指令用于设置网站的默认首页。

域名重定向

  1. server{
  2. listen 80 ;
  3. server_name mxiaoqi.top aaa.com;
  4. if ( $host = mxiaoqi.top )
  5. #增加判断条件,当访问域名是mxiaoqi.top的时候
  6. {
  7. rewrite /(.*) http://aaa.com/$1 permanent;
  8. #把mxiaoqi.top/后面的内容重新写到aaa.com/后面如果后面有多段则使用$2、$3以此类推
  9. #permanent是转发状态码
  10. }
  11. index index.html index.htm index.php;
  12. root /data/wwwroot/mxiaoqi.top;
  13. }

反向代理

使用 nginx 反向代理 www.123.com 直接跳转到127.0.0.1:8080

  1. server {
  2. listen 80;
  3. server_name www.123.com;
  4. location / {
  5. proxy_pass http://127.0.0.1:8080;
  6. # 欢迎页面,按照从左到右的顺序查找页面
  7. index index.html index.htm index.jsp;
  8. }
  9. }

监听80端口,访问域名为www.123.com,不加端口号时默认为80端口,故访问该域名时会跳转到127.0.0.1:8080路径上。

限流配置

漏桶算法与令牌桶算法区别

主要区别在于“漏桶算法”能够强行限制数据的传输速率,
而“令牌桶算法”在能够限制数据的平均传输速率外,还允许某种程度的突发传输。在“令牌桶算法”中,只要令牌桶中存在令牌,那么就允许突发地传输数据直到达到用户配置的门限,因此它适合于具有突发特性的流量。
Nginx按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。

  • limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 “leaky bucket”。
  • limit_req_conn 用来限制同一时间连接数,即并发限制。

    limit_req_zone 参数配置

    Syntax: limit_req zone=name [burst=number] [nodelay];
    Default: —
    Context: http, server, location

    1. limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
  • 第一个参数:$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。

  • 第二个参数:zone=one:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息。
  • 第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。

    1. limit_req zone=one burst=5 nodelay;
  • 第一个参数:zone=one 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。

  • 第二个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
  • 第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队。

    ngx_http_limit_conn_module 参数配置

    这个模块用来限制单个IP的请求数。并非所有的连接都被计数。只有在服务器处理了请求并且已经读取了整个请求头时,连接才被计数。
    Syntax: limit_conn zone number;
    Default: —
    Context: http, server, location
  1. limit_conn_zone $binary_remote_addr zone=addr:10m;
  2. server {
  3. location /download/ {
  4. limit_conn addr 1;
  5. }

一次只允许每个IP地址一个连接。

负载均衡

  1. #user nobody;
  2. worker_processes 1;
  3. error_log logs/error.log;# 开启日志
  4. pid logs/nginx.pid;
  5. ...
  6. upstream lyf {
  7. server 192.168.37.220:8001; # 3个tomcat服务
  8. server 192.168.37.220:8002;
  9. server 192.168.37.220:8003;
  10. }
  11. server {
  12. listen 80;
  13. server_name 192.168.37.220;# 监听ip
  14. location / {
  15. proxy_pass http://lyf; # 设置代理
  16. index index.html index.htm;
  17. }
  18. }

keepalive 长连接提高吞吐量

keepalived:设置长连接处理的数量
proxy_http_version:设置长连接http版本为1.1
proxy_set_header:清除connection header 信息

  1. upstream tomcats {
  2. # server 192.168.1.173:8080 max_fails=2 fail_timeout=1s;
  3. server 192.168.1.190:8080;
  4. # server 192.168.1.174:8080 weight=1;
  5. # server 192.168.1.175:8080 weight=1;
  6. keepalive 32;
  7. }
  8. server {
  9. listen 80;
  10. server_name www.tomcats.com;
  11. location / {
  12. proxy_pass http://tomcats;
  13. proxy_http_version 1.1;
  14. proxy_set_header Connection "";
  15. }
  16. }

工作方式

  1. 轮询方式是Nginx负载默认的方式
    2. 权重方式 指定每个服务的权重比例,weight和访问比率成正比
    1. upstream dalaoyang-server {
    2. server localhost:10001 weight=1;
    3. server localhost:10002 weight=2;
    4. }
  2. iphash
    每个请求都根据访问ip的hash结果分配,经过这样的处理,每个访客固定访问一个后端服务,如下配置(ip_hash可以和weight配合使用)。
    1. upstream dalaoyang-server {
    2. ip_hash;
    3. server localhost:10001 weight=1;
    4. server localhost:10002 weight=2;
    5. }
  3. 最少连接
    将请求分配到连接数最少的服务上。

    1. upstream dalaoyang-server {
    2. least_conn;
    3. server localhost:10001 weight=1;
    4. server localhost:10002 weight=2;
    5. }

    5.fair
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

    1. upstream dalaoyang-server {
    2. server localhost:10001 weight=1;
    3. server localhost:10002 weight=2;
    4. fair;
    5. }

    Consul+upsync+Nginx 实现无需raload动态负载均衡

    传统的负载均衡,如果Upstream参数发生变化,每次都需要重新加载nginx.conf文件,
    因此扩展性不是很高,所以可以采用动态负载均衡,实现Upstream可配置化、动态化,无需人工重新加载nginx.conf。

    LVS+Keepalived+Nginx+Tomcat搭建高可用双机主从热备集群

    需要明确的是:

  4. Nginx两台是主备关系,只有一台在工作。后面的tomcat是集群,同时工作的。

  5. keepalived是同时安装在两台Nginx上的,不过文件配置不一样
  6. 这里的双机热备是指LVS,Nginx则是集群
    keepalived
    健康检查和失败切换是keepalived的两大核心功能。所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。
    LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。lvs目前是集成在Linux内的。
    Nginx配置文件详解 - 图2
    Nginx配置文件详解 - 图3
    Nginx配置文件详解 - 图4

    为什么要LVS+Nginx?

    一、ngix(应用层 网络七层负载均衡)
    1、异步转发,请求数据和相应数据都要经过ngix,ngix和客户端建立连接
    2、轮询所有的tomcat服务器,保证请求成功或者最后一台tomcat服务器也请求失败
    二、lvs(网络层 网络四层负载均衡)
    1、同步转发接受请求数据,lvs转发到服务器,服务器直接和客户端建立连接
    nginx要承受所有的流量,当一台nigx承受不了,就需要搭建ngix集群。ngix+ngix 外层的ngix还是要承受所有流量。
    lvs+ngix:lvs同步转发不会接受相应数据,LVS采用DR模式时不用响应服务器返回的内容。(通常请求数据是比较小的,响应数据会比较大)
    Nginx配置文件详解 - 图5

    静态资源配置

    ```nginx location ~ .*.(jpg|gif|png)$ { gzip on; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript image/jpeg image/gif image/png; root /usr/share/nginx/images; }

location ~ .*.(txt|xml)$ { gzip on; gzip_http_version 1.1; gzip_comp_level 1; gzip_types text/plain application/javascript image/jpeg image/gif image/png; root /usr/share/nginx/code; } location ~ ^/download { gzip_static on; tcp_nopush on; root /opt/app/code; }

  1. `sendfile on | off`,文件读取配置<br />默认`sendfile`是关闭的,可以配置在`http`,`server`,`location`,`if in location`中<br />`tcp_nopush on | off`,多个包整合<br />默认是关闭状态,可以在`http`,`server`,`location`中配置,它的作用是在`sendfile`开启的情况下,提高网络包的传输效率。什么意思呢,假设服务端收到请求,需要推送10个包,为了提高传输效率,这10个包不会一个一个返回给客户端,而是将10个包攒够了后一起返回回去。<br />`tcp_nodelay on | off`,网络包的实时性传输<br />默认开启,可以在`http`,`server`,`location`中配置,它的作用是在`keepalive`链接下,提高网络包的传输实时性。<br />`gzip on | off`,压缩<br />默认是关闭状态,可以在`http`,`server`,`location`,`if in location`中配置,作用是压缩传输。一般来说浏览器是可以对压缩后的内容进行解压的。<br />`gzip_comp_level level`;压缩级别<br />默认的压缩级别是`1`,可以在`http`,`server`,`location`中配置,级别配置的越高,压缩的越好,但是压缩会耗费服务端的计算资源,所以要控制好压缩级别<br />`gzip_http_version 1.0 | 1.1`,压缩对http协议的支持<br />默认对HTTP/1.1协议的请求才会进行gzip压缩,可以配置在`http`,`server`,`location`中配置。当用户想要读取一个1.html文件,首先会在目录中找寻1.html.gz是否存在,所以这就导致了磁盘资源的浪费,必须要存储两份文件。
  2. ```nginx
  3. ###静态资源访问
  4. server {
  5. listen 80;
  6. server_name static.itmayiedu.com;
  7. location /static/imgs {
  8. root F:/;
  9. index index.html index.htm;
  10. }
  11. }
  12. ###动态资源访问
  13. server {
  14. listen 80;
  15. server_name www.itmayiedu.com;
  16. location / {
  17. proxy_pass http://127.0.0.1:8080;
  18. index index.html index.htm;
  19. }
  20. }

跨域配置

Nginx配置文件详解 - 图6
跨域就是在原站点访问域名不同的其他站点,同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。
CORS 是跨域资源分享(Cross-Origin Resource Sharing)的缩写。它是 W3C 标准,属于跨源 AJAX 请求的根本解决方法。
1、普通跨域请求:只需服务器端设置Access-Control-Allow-Origin
2、带cookie跨域请求:前后端都需要进行设置

  1. #允许跨域请求的域,*代表所有
  2. add_header 'Access-Control-Allow-Origin' *;
  3. #允许带上cookie请求
  4. add_header 'Access-Control-Allow-Credentials' 'true';
  5. #允许请求的方法,比如 GET/POST/PUT/DELETE
  6. add_header 'Access-Control-Allow-Methods' *;
  7. #允许请求的header
  8. add_header 'Access-Control-Allow-Headers' *;

防盗链

  1. #对源站点验证
  2. valid_referers *.imooc.com;
  3. #非法引入会进入下方判断
  4. if ($invalid_referer) { return 404; }