关于 Nginx 的哪些事

关于 Nginx 的哪些事

1、Nginx 主要功能

Nginx主要功能:

  • 正向代理:需要在客户端配置代理服务器,进行指定网站访问。

  • 反向代理:反向代理是Nginx的常见功能之一。当客户端向服务器发送请求时,首先经过Nginx服务器,然后Nginx将请求转发给内部的Web服务器。这种代理方式使得外部网络无法直接访问内部的Web服务器,提高了安全性。

  • 负载均衡:它将网络流量分担到多个网络节点上,并行处理请求,从而提高网络系统的处理能力,减少前端用户等待响应的时间。

  • 动静分离:将动态网页和静态页面分开处理。通过动静分离,Nginx可以充分利用其高并发、高性能的特点,同时减轻后端服务器的负载,提高网站的访问速度和可维护性。

2、Nginx 的常用命令

2.1、启动Nginx

shell 复制代码
# 首先进入 Nginx 目录 (一般在该目录,具体根据实际安装情况而定)
cd /usr/local/nginx
# 启动 Nginx
./sbin/nginx

# 或者直接执行
/usr/local/nginx/sbin/nginx

2.2、停止 Nginx

shell 复制代码
# 首先进入 Nginx 目录  (一般在该目录,具体根据实际安装情况而定)
cd /usr/local/nginx
# 停止 Nginx
./sbin/nginx -s stop
# 或者在 Nginx 目录执行
./sbin/nginx -s quit

# 或者直接执行
/usr/local/nginx/sbin/nginx -s stop
# 或
/usr/local/nginx/sbin/nginx -s quit

2.3、重新加载Nginx 配置

shell 复制代码
# 首先进入 Nginx 目录  (一般在该目录,具体根据实际安装情况而定)
cd /usr/local/nginx
# 重新加载Nginx 配置
./sbin/nginx -s reload

2.4、检查Nginx配置文件

shell 复制代码
# 首先进入 Nginx 目录  (一般在该目录,具体根据实际安装情况而定)
cd /usr/local/nginx
# 检查Nginx配置文件是否正确
./sbin/nginx -t

2.5、指定配置文件

shell 复制代码
# 首先进入 Nginx 目录  (一般在该目录,具体根据实际安装情况而定)
cd /usr/local/nginx
# 指定配置文件:在命令行中添加 -c 参数。例如:
./sbin/nginx -c /usr/local/nginx/conf/nginx.conf

2.6、检查Nginx版本

shell 复制代码
# 首先进入 Nginx 目录  (一般在该目录,具体根据实际安装情况而定)
cd /usr/local/nginx
# 检查Nginx版本
./sbin/nginx -V
# 或者在Nginx目录中执行
./sbin/nginx -v

2.7、显示Nginx帮助信息

shell 复制代码
# 首先进入 Nginx 目录  (一般在该目录,具体根据实际安装情况而定)
cd /usr/local/nginx
# 显示Nginx帮助信息
./sbin/nginx -h

3、Nginx 配置文件 nginx.conf

Nginx 配置文件路径,一般在 /etc/nginx/nginx.conf/usr/local/nginx/conf/nginx.conf

3.1、Nginx 配置文件(nginx.conf)组成部分

  • ① 全局块:从配置文件开始到events块之间的内容,主要设置一些影响nginx服务器整体运行的配置命令,如worker_processes、worker_processes值等。

  • ② events块:主要配置Nginx服务器与用户的网络连接,包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接等。

  • ③ http块:这是Nginx服务器配置中最频繁的部分,包括http全局块、server块等。http全局块配置指令包括文件引入、MIME-TYPE定义、日志定义、连接超时时间、单链接请求数上限等。

此外,Nginx还支持对stream和server块的配置,stream块用于配置HTTP和SMTP代理服务器的代理设置,server块用于配置虚拟主机的设置。

3.2、Nginx 配置文件(nginx.conf)示例

nginx 复制代码
# 指定Nginx服务器的用户
user  nginx;  
# 指定Nginx服务器的工作进程数。
worker_processes  1;  
# 指定错误日志存放路径  
error_log  /var/log/nginx/error.log;  
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# 指定Nginx进程的存放路径。
pid        /var/run/nginx.pid;  
  
events {  
    # 指定每个worker process的最大连接数
    worker_connections  1024;  
    # 指定Nginx服务器的工作进程数。
    # worker_processes 20;
    # 指定是否允许一个worker process同时接收多个网络连接。
    multi_accept on;  
}  
  
http {  
    include       /etc/nginx/mime.types;  
    default_type  application/octet-stream;  
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
                      '$status $body_bytes_sent "$http_referer" '  
                      '"$http_user_agent" "$http_x_forwarded_for"';  
    access_log  /var/log/nginx/access.log  main;  
  
    sendfile        on;  
    tcp_nopush     on;  
    tcp_nodelay    on;  
    keepalive_timeout  65;  
    types_hash_max_size 2048;  
    # gzip:开启gzip压缩,减少传输数据量。
    # gzip  on;
  
    # 该 server 配置了Nginx作为反向代理服务器,
    # 将所有以example.com为域名的HTTP请求转发到192.168.1.100:8080的目标服务器。
    server {  
        # listen:指定Nginx监听的端口号。例如,listen 80,表示Nginx将监听80端口。
        listen 80;  
        # server_name:指定服务器名称,可以是一个域名或多个域名。
        # 指定Nginx要代理的域名,表示Nginx将代理example.com域名的请求。
        server_name example.com;  
        
        # charset:设置字符集。
        # charset koi8-r;
        
        # access_log  logs/host.access.log  main;
        
        # 指定要代理的请求路径。例,location / { ... }表示Nginx将对所有请求进行代理
        # location /:匹配所有以该主机名开头的URL路径。
        location / {  
            # 指定代理的目标服务器。
            # 这里指Nginx将所有请求代理到192.168.1.100:8080的目标服务器。
            proxy_pass http://192.168.1.100:8080;  
            # index:指定默认页面,可以是index.html、index.htm或index.nginx-debian.html。
            # index  index.html index.htm;
            
            # try_files:用于尝试访问本地文件或定义的其他动作,如重定向、返回特定状态码等。
            # try_files $uri $uri/ /index.html;
        }  
        
        # error_page:指定错误页面,用于处理特定错误码的页面。
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
       
        # error_page:指定错误页面,用于处理特定错误码的页面。
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }  
    # 该server段落,配置了Nginx作为反向代理和HTTPS代理服务器。
    # 这里将所有以example.com为域名的HTTPS请求,转发到192.168.1.100:8080的目标服务器,     # 并使用SSL证书进行加密传输。
    server {  
        # listen:指定Nginx监听的端口号。
        listen 443 ssl;  
        # server_name:指定服务器名称,可以是一个域名或多个域名。
        # 指定Nginx要代理的域名,表示Nginx将代理example.com域名的请求。
        server_name example.com;  
        # ssl_certificate:指定SSL证书的路径。
        # 这里表示Nginx将使用位于/etc/nginx/ssl/nginx.crt的SSL证书。
        ssl_certificate /etc/nginx/ssl/nginx.crt;  
        ssl_certificate_key /etc/nginx/ssl/nginx.key;  
        
        # ssl_session_cache    shared:SSL:1m;
        # ssl_session_timeout  5m;
 
        # ssl_ciphers  HIGH:!aNULL:!MD5;
        # ssl_prefer_server_ciphers  on;
        
        # location 用于匹配特定URL,并定义相应的代理规则或静态文件路径。
        location / {  
            # proxy_pass:定义反向代理规则。
            proxy_pass http://192.168.1.100:8080;  
        }  
    }  
    
    
    # 
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    # index:指定默认页面,可以是index.html、index.htm或index.nginx-debian.html。
    #        index  index.html index.htm;
    #    }
    #}
    
}

4、反向代理

4.1、简单示例

在下面示例中,Nginx作为反向代理服务器,将所有以example.com为域名的HTTP请求转发到192.168.1.100:8080的目标服务器。同时,通过proxy_set_header指令设置了一些必要的请求头信息,以便目标服务器正确地处理请求。该示例仅适用于HTTP协议的代理配置。

nginx 复制代码
server {  
    listen 80;  
    server_name example.com;  
    # location /:匹配所有以该主机名开头的URL路径。
    location / {  
        proxy_pass http://192.168.1.100:8080;  
        proxy_set_header Host $host;  
        proxy_set_header X-Real-IP $remote_addr;  
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
    }  
}

注意:目标服务器,需要对外开放访问的端口

nginx 复制代码
# 以下是基于 CentOS7 版本的防火墙相关命令。

# 查看防火墙状态
firewall-cmd --state

# 如果防火墙处于关闭状态,先启动它
systemctl start firewalld.service

# 防火墙开放8080 端口号
firewall-cmd --add-port=8080/tcp --permanent

# 重启防火墙以使更改生效
systemctl restart firewalld.service

# 重新加载防火墙配置
firewall-cmd --reload

# 查看已经开放的端口号
firewall-cmd --list-all

4.2、location 语法

在NGINX中,location指令用于定义请求匹配的URL路径和相应的配置。它是在NGINX配置文件中的server块内使用的。下面是location指令的基本语法:

nginx 复制代码
location [=|~|~*|^~] /path {  
    # 配置指令  
}

# 说明:
=   :表示完全匹配指定的路径。
~   :表示使用正则表达式匹配路径。
~*  :表示不区分大小写的正则表达式匹配路径。
^~  :表示前缀匹配路径,但不使用正则表达式。

location 匹配优先级:
= 大于 ^~ 大于 ~ | ~* 大于 最长前缀匹配 大于 /

4.2.1、精准匹配(=)

精准匹配的符号标记为"=",示例:

nginx 复制代码
# 如果请求URI和精准匹配的模式字符串/api完全相同,那么精准匹配通过.
# 在所有的匹配类型中,精准匹配的优先级最高.
location = /api {
    proxy_pass http://192.168.1.100:8080;  
}

# 假设 server_name example.com;  
# 只匹配http://example.com/abc
# http://example.com/api [匹配成功]
# http://example.com/api/index [匹配失败]

4.2.2、普通匹配(^~)

普通匹配的符号标记为"~",普通匹配是前缀匹配,也是Nginx默认的匹配类型。类型符号"~"可以省略,如果location没有任何匹配类型,就为普通的前缀匹配。示例:

nginx 复制代码
# 普通匹配:如果请求路径URI头部,匹配到location的模式字符串,那么匹配成功。
# 如果匹配到多个前缀,那么最长模式匹配优先
# 匹配以"/api/"开头的所有请求
location ^~ /api/ {
  proxy_pass http://192.168.1.100:8080;  
}

location ^~ /api/demo {
  proxy_pass http://192.168.1.101:8081;  
}

# 假设 server_name example.com;  
#以 /api/ 开头的请求,都会匹配上
#http://example.com/api/index.page  [匹配成功]
#http://example.com/error/error.page [匹配失败]

# 以上 http://example.com/api/demo/index.page 请求  [匹配成功] 
# 且 http://example.com/api/demo/index.page 请求,优先匹配目标:http://192.168.1.101:8081


location ^~ /api/ {
  proxy_pass http://192.168.1.100:8080;  
}
# 等同于
location /api/ {
  proxy_pass http://192.168.1.100:8080;  
}

4.2.3、正则匹配(~)

正则匹配的类型,根据类型符号的不同,可以细分为以下4种 :

  • ~:标准正则匹配,区分字母大小写,进行正则表达式测试,若测试成功,则匹配成功。

  • ~*:标准正则匹配,不区分字母大小写,进行正则表达式测试,若测试成功,则匹配成功。

  • !~:反向正则匹配,区分字母大小写,进行正则表达式测试,若测试不成功,则匹配成功。

  • !~*:反向正则匹配,不区分字母大小写,进行正则表达式测试,若测试不成功,则匹配成功。

nginx 复制代码
# ~ :区分字母大小写
location ~ /Api/ {
  proxy_pass http://192.168.1.100:8080;  
}
# 假设 server_name example.com; 
#http://example.com/Api/ [匹配成功]
#http://example.com/api/ [匹配失败]


# ~* :不区分字母大小写
location ~* /Api/ {
  proxy_pass http://192.168.1.100:8080;  
}
# 假设 server_name example.com; 
# 则会忽略 uri 部分的大小写
#http://example.com/Api/ [匹配成功]
#http://example.com/api/ [匹配成功]

4.2.4、默认根路径匹配(/)

根路径的路径规则就是使用单个"/"符号,示例:

nginx 复制代码
# 匹配所有以该主机名开头的URL路径。
location  /  {
    proxy_pass http://192.168.1.100:8080; 
}

4.2.5、nginx内部跳转(@)

nginx 复制代码
location /index/ {
  error_page 404 @index_error;
}
location @index_error {
  .....
}
#以 /index/ 开头的请求,如果链接的状态为 404。则会匹配到 @index_error 这条规则上。

4.2.6、location URI结尾带不带 /

在 Nginx 中,location指令用于匹配请求的 URL,并根据匹配的结果来配置相应的代理、重定向、静态文件服务等操作。在 location指令中,URL最后是否带有斜杠(/)会对匹配的结果产生一些区别。浏览器在发起请求的时候,默认加上了 / 。虽然很多浏览器在地址栏里也不会显示 /

  1. URL最后带有斜杠(/):
    • 当 URL 以斜杠结尾时,location指令会精确匹配该 URL。例如,如果配置了location /foo/,则只有请求的 URL 为 /foo/ 时才会匹配,但不匹配 /foo/foo123 等。
    • 如果请求的 URL 是 /foo/bar,则不会匹配 location /foo/,因为最后有一个额外的路径片段(bar)。
    • 如果需要匹配以foo结尾的所有 URL,包括/foo//foo/bar等,可以使用正则表达式,例如location ~ ^/foo/$
  2. URL最后没有斜杠(/):
    • 当 URL 不以斜杠结尾时,location指令会匹配以该 URL 为前缀的所有 URL。例如,如果配置了location /foo,则请求的 URL 为/foo/foobar/foo/bar等以/foo为前缀的 URL 都会匹配。
    • 如果请求的 URL 是/foo/bar,则会匹配location /foo,因为/foo是该 URL 的前缀。

总结起来,是否在 location指令的 URL 最后加上斜杠,决定了是精确匹配还是前缀匹配。具体使用哪种方式取决于你的需求,如果需要精确匹配某个 URL,可以使用斜杠结尾;如果需要匹配某个前缀的所有 URL,则可以去掉斜杠。

5、负载均衡

5.1、简单示例

nginx 复制代码
# 使用 upstream 块定义了一个名为 backend 的后端服务器组。
# 在该后端服务器组中,列出了三个后端服务器 
# 192.168.1.100:8080、192.168.1.101:8081 和 192.168.1.102:8082
upstream backend {  
    server 192.168.1.100:8080;  
    server 192.168.1.101:8081;  
    server 192.168.1.102:8082;  
}  
  
server {  
    listen 80;  
    server_name example.com;  
  
    location / {  
        proxy_pass http://backend;  
        # 在这里配置其他相关的反向代理设置  
    }  
}

5.2、常用负载均衡策略

以下是几种常见的策略:轮询、权重、IP哈希、最少连接。

5.2.1、轮询

轮询(Round Robin):每个请求按时间顺序逐一分配到不同的后端服务器。如果后端服务器down掉,Nginx会自动剔除该服务器。

nginx 复制代码
# 默认采用轮询策略,示例:
upstream backserver {  
    server 192.168.0.14;  
    server 192.168.0.15;  
}

5.2.2、权重轮询

权重轮询(Weighted Round Robin):在轮询策略的基础上,指定每个后端服务器的轮询几率,权重值越高的服务器被选择的可能性就越大。

nginx 复制代码
# 使用示例:
upstream backserver {  
    server 192.168.0.14 weight=2;  
    server 192.168.0.15 weight=1;  
}

5.2.3、IP哈希

IP哈希(IP Hash):指定负载均衡器按照基于客户端IP的分配方式。这个方法确保了相同的客户端的请求一直发送到相同的后端服务器,以保持会话一致性。

nginx 复制代码
# 使用示例:
upstream backserver {  
    ip_hash;  
    server 192.168.0.14;  
    server 192.168.0.15;  
}

5.2.4、最少连接

最少连接(Least Connections):把请求转发给连接数最少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。使用最少连接策略可以更好地平衡负载。

nginx 复制代码
# 使用示例:
upstream backserver {  
    least_conn;  
    server 192.168.0.14;  
    server 192.168.0.15;  
}

6、动静分离

Nginx 的动静分离,是指将动态请求和静态请求,分发到不同的后端处理。

动态请求通常需要与数据库等进行交互,处理逻辑较为复杂。而静态请求,则是指只需要直接返回静态文件或资源的请求,处理速度较快。

通过动静分离,可以将动态请求交给专门的动态服务器处理,而静态请求则可以由更高效的静态服务器处理,从而提高整体的处理性能和响应速度。

nginx 复制代码
server {  
    listen 80;  
    server_name example.com;  
  
    # 动态请求
    location /dynamic {  
       proxy_pass http://dynamic_server;
    }
  
    location /css {  
        # root指令用于指定静态文件的根目录
        root /path/to/css;  
    }  
  
    location /js {  
         # root指令用于指定静态文件的根目录
        root /path/to/js;  
    }  
    
    # 页面访问方式一:
    location /front {
         root /data;
         index index.html;
    }
    
    # 页面访问方式二:
    location /web {
         alias /data/front;
         index index.html;
    }

    # 图片访问方式一:
    location /static {
        root /data/front; 
    }
    
    # 图片访问方式二:
    location /photo {
        alias /data/front/static;
    }
}

注意:aliasroot指令都是用于指定文件路径的,但它们的使用方式和效果有所不同。

alias指令用于指定匹配的URL段对应的文件或目录的路径。当请求的URL匹配location块中配置的URL段时,NGINX会将其重定向到alias指令指定的路径下对应的文件或目录。这意味着请求的URL将会发生变化,从原来的URL变为新的URL。

例如,下面的配置将请求的URL为/images/example.jpg重定向到/var/www/html/images/example.jpg

nginx 复制代码
location /images {  
    alias /var/www/html/images;  
}

root指令则是指定最上层目录的定义,它不会改变请求的URL。当请求的URL匹配location块中配置的URL段时,NGINX会在指定的目录下查找对应的文件。

例如,下面的配置将请求的URL为/images/example.jpg映射到/var/www/html/images/example.jpg

nginx 复制代码
location /images {  
    root /var/www/html;  
}

7、Nginx 限流

nginx可以通过以下方式实现限流:基于IP限流、基于URL限流、基于时间限流。

7.1、基于IP限流

基于IP的限流,可以有效地控制每个IP地址的请求频率和请求数,有助于防止恶意攻击和保护服务器的性能。

需要注意的是,限流区域的配置和限流指令的应用,需要根据实际需求进行调整和优化。

示例配置:

nginx 复制代码
# 创建限流区域one,限制每个IP的请求频率为1次/秒
# $binary_remote_addr 是用于存储限流信息的共享内存名称,使用了10MB的共享内存
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;  
# 创建限流区域two,限制每个IP的请求频率为2次/秒
limit_req_zone $binary_remote_addr zone=two:10m rate=2r/s;  
  
server {  
    location / {  
        # 使用limit_req指令,指定使用one限流区域
        # 设置burst参数为1,表示允许每个IP在突发情况下最多多发送一个请求。
        limit_req zone=one burst=1;  
        ...  
    }  
}
  • 限流算法:

    • nginx的限流算法使用了漏桶算法。

    • 当请求到达时,会先检查对应的限流桶中的请求数量是否已经达到限制速率。

    • 如果未达到限制速率,则允许请求通过,并在限流桶中增加一个请求。

    • 如果达到限制速率,则需要检查是否允许突发请求。

      • 如果允许突发请求,则允许请求通过,并在限流桶中增加一个请求,同时记录突发请求数;

      • 如果不允许突发请求,则直接拒绝请求。

7.2、基于URL限流

基于URL的限流,可以有效地控制每个URL的请求频率和请求数,有助于保护服务器的性能和防止滥用。

基于URL的限流方式,适用于限制某些频繁访问的URL,或者限制对某些重要接口的请求频率,以保护服务器资源或者控制某些URL的使用。

需要注意的是,限流区域的配置和限流指令的应用,需要根据实际需求进行调整和优化。

示例配置:

nginx 复制代码
# 实现基于URL的限流,要先配置限流区域 limit_req_zone,限流区域是一个存储URL和相关统计信息的缓存区。
# $uri 用于存储限流信息的共享内存名称,这里创建了一个名为one的限流区域,使用了10MB的共享内存。
# rate 是每个URL的请求限制速率,这里限制了每个URL的请求频率为1次/秒。
limit_req_zone $uri zone=one:10m rate=1r/s;

location /api/ {  
    # 针对/api/路径进行限流,limit_req指令来指定使用限流区域为one
    # burst参数为10,表示允许每个URL在突发情况下最多多发送10个请求。
    limit_req zone=one burst=10;  
    ...  
}
  • 限流算法:
    • nginx的限流算法使用了漏桶算法。
    • 当请求到达时,会先检查对应的限流桶中的请求数量,是否已经达到限制速率。
    • 如果未达到限制速率,则允许请求通过,并在限流桶中增加一个请求。
    • 如果达到限制速率,则需要检查是否允许突发请求。
      • 如果允许突发请求,则允许请求通过,并在限流桶中增加一个请求,同时记录突发请求数;
      • 如果不允许突发请求,则直接拒绝请求。

.

相关推荐
七夜zippoe7 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy6488 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满9 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠9 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey9039 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技10 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀10 小时前
Linux环境变量
linux·运维·服务器
zzzsde10 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º12 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~12 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化