Nginx 超全的配置

官网:nginx: download

一、Nginx编译安装
1、下载
wget https://nginx.org/download/nginx-1.26.2.tar.gz && tar zxvf nginx-1.26.2.tar.gz && cd nginx-1.26.2/
2、安装依赖

yum

yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

apt

sudo apt-get install gcc g++ libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
3、编译
./configure  --help  查看可用模块
​
./configure \
--user=nginx \
--group=nginx \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-stream \
--with-http_realip_module && make
​
 参数说明:
        --prefix 用于指定nginx编译后的安装目录
        --add-module 为添加的第三方模块
        --with..._module 表示启用的nginx模块,如此处启用了好几个模块
4、安装
make install
5、启动/停止/重载
查看配置文件是否正确:nginx -t
启动:nginx
重载:nginx -s reload
停止:nginx -s stop或者是通过kill nginx进程号
查看版本及编译参数:nginx –V

二、Nginx漏洞修复

1、隐藏版本信息
http{
     server_tokens off; #隐藏nginx版本信息
     ....
}

三、Nginx常用配置

nginx.conf 配置结构

# 全局配置
...........
# events 工作模式及连接数
events {
    .........
}
​
# 服务器池
upstream {
    ........
}
​
# http模块相关配置
http {
    .........
    # 虚拟主机,可以有多个,端口不冲突即可
    server{
       ..........
            # 匹配规则
            location {
            .............
        }
    }
}

1、全局配置
#user  nobody;  # 启动用户,权限越低越好,默认为nobody.
worker_processes  1;  # 工作进程数量,根据cpu核数设置. 可设置成auto 由nginx自动根据cpu核数配置.
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info; 日志级别 debug|info|notice|warn|error|crit|alert|emerg,错误级别从左到右越来越大
 
#pid        logs/nginx.pid; # nginx的pid文件位置
​
events {
    .........
}
​
http {
    .........
    server{
       ..........
            location / {
            .............
        }
    }
}

2、events配置
# 全局配置
...........
events {
    use epoll; # 事件模型 默认为epoll 可选事件模型:epoll|kqueue|select|poll|eventport  事件模型对比-[点击跳转](#events_use)
    worker_connections  1024; # 每个worker允许连接的客户端最大连接数
}
http {
    .........
    server{
       ..........
            location / {
            .............
        }
    }
}

3、http配置
# 全局配置
...........
events {
...........
}
http {
    # 引入一个定义了各种文件扩展名与对应的 MIME 类型映射关系的文件,
    # 以便 Nginx 能够正确识别和设置响应的 Content-Type 头。
    include mime.types;
    # 如果 Nginx 无法确定请求文件的 MIME 类型,就使用默认的“application/octet-stream”类型,
    # 通常会提示客户端下载文件而不是在浏览器中显示。
    default_type application/octet-stream;
​
    # 以下是注释的日志格式和访问日志配置,可根据需要开启。
    # 定义一种名为“main”的日志格式,其中包含客户端 IP 地址、用户、时间、请求内容、
    # 响应状态码、发送的字节数、引用来源、用户代理和经过代理后的客户端 IP 地址等信息。
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    参数名          参数意义
    $remote_addr   客户端ip
    $remote_user   远程客户端用户名,一般为:’-’
    $time_local    时间和时区
    $request       请求的url以及method
    $status        响应状态码
    $body_bytes_send        响应客户端内容字节数
    $http_referer           记录用户从哪个链接跳转过来的
    $http_user_agent        用户所使用的代理,一般来时都是浏览器
    $http_x_forwarded_for   通过代理服务器来记录客户端的ip
        
    # 设置访问日志的路径为“logs/access.log”,并使用前面定义的“main”日志格式来记录访问日志。
    #access_log  logs/access.log  main;
​
    # 开启高效的文件传输模式 sendfile,使用 sendfile 系统调用可以直接在内核空间将文件内容传输到网络套接字,
    # 避免在用户空间和内核空间之间多次复制数据,提高文件传输效率。
    sendfile on;
    # 以下配置如果开启,会和 sendfile 配合使用,当开启 sendfile 时,可使得在发送文件时将数据累积到一定大小后再发送,
    # 减少网络数据包的数量,提高网络传输效率。
    #tcp_nopush on;
​
    # 设置长连接的超时时间为 65 秒,即当一个连接在这段时间内没有新的请求时,Nginx 会关闭这个连接。
    # 设置适当的长连接超时时间可以减少连接建立和关闭的开销,提高性能,特别是对于频繁发起请求的客户端。
    keepalive_timeout 65;
    #gzip启用压缩,html/js/css压缩后传输会更快
    gzip on;
    
    server{
       ..........
            location / {
            .............
        }
    }
}

4、server配置
# 全局配置
...........
events {
    ............
}
http {
    .........
    server{
       listen       88; # 占用端口 tcp 
       server_name  localhost; # 主机地址可为ip或域名,多个地址时使用’,‘分隔开
            location / {
            .............
        }
        # 这段只能在server段中配置
        error_page 500 502 503 504 /50x.html; # 500 502 503 504 状态码 重定向到/50x.html
        location = /50x.html { # location = /50x.html 精确匹配后才会执行
            root /path/to/error/pages;
        }
    }
    server {
        listen 443 ssl; # 配置https 访问
        server_name localhost; # 主机地址可为ip或域名,多个地址时使用’,‘分隔开
​
        # SSL 证书文件路径
        ssl_certificate /path/to/your/server.crt;
        # SSL 私钥文件路径
        ssl_certificate_key /path/to/your/server.key;
​
        # 支持的 SSL/TLS 协议版本
        ssl_protocols TLSv1.2 TLSv1.3;
        # 加密套件
        ssl_ciphers HIGH:!aNULL:!MD5;
        # 服务器优先选择加密套件
        ssl_prefer_server_ciphers on;
    }
        
}
5、location配置
# 全局配置
...........
events {
    ............
}
http {
    .........
    server{
       .............
            location / {
               root   html; # 静态资源路径 root:将请求的路径附加到指定的路径之后 alias:直接替换请求的路径
               index  index.html index.htm; # 设置页面资源
        }
    }
}
6、负载均衡配置

1、http 负载均衡

http 负载均衡 使用 upstream name {} 配置 ,配置放到http块中

# 全局配置
...........
events {
    ............
}
​
http {
    .........
upstream servers {   # 负载均衡
   # 1、默认使用轮询算法.
   server 192.168.1.1:88; 
   server 192.168.1.2:88;
   # 2、按照权重分配流量....
   server 192.168.1.1:88 weight=2; 
   server 192.168.1.2:88 weight=1;
   # 3、ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端的服务器,可以解决session问题.
   ip_hash;
   server 192.168.1.1:88; 
   server 192.168.1.2:88;
   # 4、最少链接,下一个请求将被分配到活动连接数量最少的服务器.
   least_conn;
   server 192.168.1.1:88; 
   server 192.168.1.2:88;
   # 5、按后端服务器的响应时间来请求分配,响应时间短的优先分配. (第三方需要安装模块upstream-fair)
   fair;
   server 192.168.1.1:88; 
   server 192.168.1.2:88;
   # 6、按访问url的hash结果来分配请求,按每个url定向到同一个后端服务器,解决换后端服务器时重新拉取资源问题,减少资源占用;(第三方需要安装模块使用,使用这个轮询,不能再加权重)
   hash $request_uri;
   hash_method crc32;
   server 192.168.1.1:88; 
   server 192.168.1.2:88;
    
   # 熔断机制 在 fail_timeout 参数的时间内连续超过 max_fails 参数设置的次数,Nginx 就会将该服务器置为不可用状态,并且在 fail_timeout 参数的时间内不再给该服务器分配连接。当 fail_timeout 参数的时间结束时将尝试分配连接检测该服务器是否恢复,如果可以建立连接,则判定为恢复。
   server 192.168.1.1:88 max_fails=3 fail_timeout=10s; 
    
   # 备主机的使用 和 标注 当前主机不参加轮询
   server 192.168.1.1:88 down; # down 表示当前主机不参加轮询 
   server 192.168.1.2:88 backup; #backup代表备用主机,当其他服务器down掉或者忙时启用备注主机
    
   # 轮询中设置超时间
   keepalive_timeout 60; # 设置连接超时时间为 60 秒
   keepalive 100; # 同时保持的空闲连接数
}
    server{
       .............
            location / {
            proxy_pass http://servers; # 使用方法
               .............
        }
    }
}
2、tcp/udp负载均衡

tcp/udp负载均衡 使用 stream { upstream { } } 单独放到http块外

# 全局配置
...........
events {
    ............
}
stream {
    # tcp/udp 负载均衡 支持的轮询算法:
    #1、默认轮询从上到下 2、按照权重轮询(weight=number) 3、按照最少连接数轮询(least_conn) 使用方法同上述http负载均衡
    # 支持熔断机制 使用方法同上述http负载均衡
    #server 192.168.1.1:88 max_fails=3 fail_timeout=10s; 
    # 支持bakcup和down 使用方法同上述http负载均衡
    #server 192.168.1.1:88 down; # down 表示当前主机不参加轮询 
    #server 192.168.1.2:88 backup; #backup代表备用主机,当其他服务器down掉或者忙时启用备注主机
    
    upstream tcp { # tcp/udp 负载均衡需要添加准确的端口
        server 192.168.1.1:88 max_fails=3 fail_timeout=10s;
        server 192.168.1.2:88 max_fails=3 fail_timeout=10s;
    }
    upstream udp {
        server 192.168.1.1:89 max_fails=3 fail_timeout=10s;
        server 192.168.1.2:89 max_fails=3 fail_timeout=10s;
    }
    server {
        listen 90; # 转发端口 访问这个端口后进行tcp流量转发
            proxy_pass tcp;
    }
    server {
        listen 91 udp; # 转发端口 访问这个端口后进行udp流量转发
            proxy_pass http://udp;
    }
}
​
​
http {
    .........
    server{
       .............
            location / {
                    .............
        }
    }
}

7、反向代理配置

反向代理在客户端和服务器之间,用于转发客户端流量到后端服务器,对与客户端来说反向代理服务器就是真正的服务端,设置反向代理有如下好处:

1、负载均衡:通过轮询、熔断等算法将流量转发到后端服务器,提高了服务的可靠性

2、隐藏后端服务器只留有一个统一入口:增加了安全性,简化了系统架构。

# 全局配置
...........
events {
    ............
}
http {
    .........
    server{
        listen 80;
        server_name localhost;
​
        # 反向代理设置,匹配所有以根路径(/)开始的请求
        location / {
            # 将请求转发到名为 server 的服务器组
            proxy_pass http://server;
​
            # 设置与后端服务器建立连接的超时时间为 60 秒
            proxy_connect_timeout 60s;
            # 设置从后端服务器读取响应的超时时间为 120 秒
            proxy_read_timeout 120s;
            # 设置向后端服务器发送请求的超时时间为 90 秒
            proxy_send_timeout 90s;
​
            # 设置从后端服务器读取的响应头缓冲区大小为 64KB
            proxy_buffer_size 64k;
            # 设置用于读取后端服务器响应的缓冲区为 8 个 32KB 的缓冲区
            proxy_buffers 8 32k;
​
            # 将客户端请求中的 Host 头部信息传递给后端服务器
            proxy_set_header Host $host;
            # 设置 X-Real-IP 头部为客户端的真实 IP 地址
            proxy_set_header X-Real-IP $remote_addr;
            # 设置 X-Forwarded-For 头部,包含客户端 IP 和可能经过的代理服务器 IP 列表
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
​
            # 根据特定的 HTTP 头部决定是否缓存响应以及在特定条件下绕过缓存
            proxy_no_cache $http_pragma $http_authorization;
            proxy_cache_bypass $http_pragma $http_authorization;
        }
    }
}

8、防盗链配置

通过referer 来确定访问来源

# 全局配置
...........
events {
    ............
}
http {
    .........
    server{
        listen 80;
        server_name localhost;
       
        # 表示对指定的文件类型(图片、视频等)进行防盗链处理。你可以根据实际情况调整文件类型。   
        # ~:开始正则匹配
        # .*:.表示出换行符/n之外的所有字符,*就是匹配0次或多次。
        # \.:\转译符号将具有特殊含义的字符,转为纯字符型,.这里有包含任意字符的意思,所以需要转译
        # (png|jpg|gif)$:表示结尾要是以png、jpg、gif为结尾
        location ~* \.(jpg|jpeg|png|gif|bmp|swf|flv|mp4)$ { 
            # 指定了合法的 referer 来源。
            # 这里none表示没有 referer 的请求是合法的
            # blocked表示 referer 被遮蔽的请求是合法的
            # *.example.com表示来自example.com及其子域名的请求是合法的。你可以根据实际情况修改为你的域名。
            valid_referers none blocked *.example.com; 
            if ($invalid_referer) { # 如果请求的 Referer 不符合valid_referers中指定的规则,Nginx 就会将$invalid_referer设置为 “1”,表示非法的 Referer;如果请求的 Referer 合法,$invalid_referer就被设置为 “0”。
                return 403; # 表示如果 referer 不合法,返回 403 禁止访问状态码。
                # 或者使用rewrite ^/ /2.jpg break; 返回图片
            }
        }
    }
}

9、配置禁止ip访问
# 全局配置
...........
events {
    ............
}
http {
    .........
    server {
            allow 192.168.100.10/24; # 可以放到server或者location中
            deny all; 
        location /downloads/ {
            # allow 允许访问的网段
            allow 192.168.100.10/24;
            # deny 禁止访问 all 代表所有也可以替换成ip或ip段
            deny all; 
            
        }
    }
}

10、文件下载
# 全局配置
...........
events {
    ............
}
http {
    .........
    server {
         ........
        location /downloads/ {
            alias /usr/local/soft/nginx/html/;  # 替换为实际的文件存储路径
            autoindex on;  # 启用目录浏览
            autoindex_exact_size off;  # 以更友好的方式显示文件大小
            autoindex_localtime on;  # 以本地时间显示文件修改时间
            charset utf-8; # 防止中文乱码
            # 控制下载速度(可选)
            limit_rate 100k;  # 限制每秒 100k 的下载速度,您可以根据需要调整
        }
    }
}

11、http强制转https

网站部署中非常常见,为了确保数据传输的安全性都会强制转到https链接

# 全局配置
...........
events {
    ............
}
http {
    .........
    server{
        listen 80;
        server_name localhost;
   
        # 方法一:使用return 301(永久)转发到https链接 host表示访问的域名 request_url表示请求的地址
        return 301 https://$host$request_uri;
        
        # 方法二:使用rewrite指令进行重定向
        # ^(.*)$任意地址  host表示访问的域名 $1表示匹配到的请求路径。permanent表示使用永久重定向(301 状态码)。 
        rewrite ^(.*)$ https://$host$1 permanent;
    }
}
12、设置密码访问

存放账号密码文件,使用第三方加密工具对密码进行加密,否则无法通过页面登录成功!!!

[root@bogon nginx]# htpasswd -c passw user01
New password:
Re-type new password:
Adding password for user user01
[root@bogon nginx]# cat passw
user01:$apr1$57qGGgl1$YzTHISh7NSxdqnrui/bOx1
# 全局配置
...........
events {
    ............
}
http {
    .........   
  server {
       .........
​
       location / {
           # 根据需要放到locaion 或者server中
           auth_basic "please input user and password";  # 显示的认证提示信息
           auth_basic_user_file /path/to/password_file;  # 密码文件的路径
       }
   }
}

13、if 判断示例
server {
    # 根据请求的主机名
    if ($http_host = "example.com") {
        return 200 "This is for example.com";
    }
    if ($http_host = "anotherdomain.com") {
        return 200 "This is for anotherdomain.com";
    }
​
    # 根据请求的 URI 路径
    if ($uri = "/product") {
        proxy_pass http://product_server;
    }
    if ($uri = "/about") {
        proxy_pass http://about_server;
    }
​
    # 根据请求方法
    if ($request_method = "GET") {
        # 处理 GET 请求的逻辑
    }
    if ($request_method = "POST") {
        # 处理 POST 请求的逻辑
    }
​
    # 根据用户代理
    if ($http_user_agent ~* "Mobile") {
        # 为移动设备返回特定内容
    }
    if ($http_user_agent ~* "Desktop") {
        # 为桌面设备返回特定内容
    }
​
    # 根据客户端的 IP 地址
    if ($remote_addr ~ "192.168.0.") {
        # 处理来自特定网段的请求
    }
​
    # 根据请求头
    if ($http_referer ~* "google.com") {
        # 处理来自 Google 引用的请求
    }
​
    # 根据参数值
    if ($arg_page = "home") {
        # 处理 page 参数为 home 的请求
    }
    if ($arg_sort = "asc") {
        # 处理 sort 参数为 asc 的请求
    }
​
    # 根据 Content-Type 判断是否下载
    if ($content_type = "application/octet-stream") {
        # 触发下载的处理逻辑
    }
​
    # 根据 Content-Disposition 判断是否下载
    if ($content_disposition ~* "attachment") {
        # 触发下载的处理逻辑
    }
​
    # 根据请求的 URI 路径判断是否下载
    if ($uri ~* "/downloads/.*") {
        # 触发下载的处理逻辑
    }
​
    # 根据请求中的特定参数判断是否下载
    if ($arg_download = "true") {
        # 触发下载的处理逻辑
    }
}

四、Nginx 状态码查询

  1. 200 OK:表示请求成功,服务器成功返回了请求的数据。

  2. 201 Created:表示请求成功并且服务器创建了新的资源。

  3. 204 No Content:表示服务器成功处理了请求,但没有返回任何内容。

  4. 301 Moved Permanently:表示请求的资源已被永久移动到新的 URL,浏览器会自动重定向到新的 URL。

  5. 302 Found:表示请求的资源临时被移动到了其他 URL,浏览器会重定向到该临时 URL。 301 和 302 状态码的主要区别在于 301 表示永久性重定向,而 302 表示临时性重定向。

  6. 304 Not Modified:表示客户端发送了一个条件请求,服务器告诉客户端其请求的资源未被修改,客户端可以使用本地缓存。

  7. 400 Bad Request:表示客户端发送的请求存在语法错误,服务器无法理解。

  8. 401 Unauthorized:表示请求需要用户认证,但客户端未提供有效的认证信息。

  9. 403 Forbidden:表示服务器理解请求,但拒绝执行,通常是因为客户端没有足够的权限。

  10. 404 Not Found:表示服务器未找到请求的资源。

  11. 500 Internal Server Error:表示服务器内部发生错误,无法完成请求。

  12. 502 Bad Gateway:表示作为网关或代理的服务器从上游服务器收到了无效的响应。

  13. 503 Service Unavailable:表示服务器暂时无法处理请求,通常是由于服务器过载或维护。

  14. 504 Gateway Timeout:表示作为网关或代理的服务器在等待上游服务器响应时超时。

五、事件模型对比</span>

豆包AI总结!

1、epoll(Linux 系统常用)
  1. 特点:

    • 在处理大量并发连接时非常高效。

    • 采用事件触发机制,当有新的连接请求、可读或可写事件发生时,才会进行相应的处理,避免了不必要的轮询操作,从而降低了系统开销。

  2. 使用场景:

    • 适用于高并发的 Web 服务器场景,尤其是在处理大量静态文件请求或反向代理等情况下表现出色。

    • 如果你的服务器运行在 Linux 系统上,并且需要处理大量并发连接,epoll 通常是一个很好的选择。

2、kqueue(FreeBSD 和 Mac OS X 常用)
  1. 特点:

    • 类似于 epoll,也是一种高效的事件通知机制。

    • 能够快速响应网络事件,并且支持对文件描述符的高效管理。

  2. 使用场景:

    • 在 FreeBSD 和 Mac OS X 系统上,如果需要处理大量并发连接,kqueue 是一个不错的选择。

    • 对于运行在这些操作系统上的 Web 服务器或其他网络应用程序,kqueue 可以提供良好的性能。

3、select 和 poll
  1. 特点:

    • 这两种事件模型相对较为传统,在处理大量并发连接时效率较低。

    • select 通常有最大文件描述符数量的限制,而 poll 没有这个限制,但它们在处理大量连接时都可能会出现性能瓶颈。

  2. 使用场景:

    • 一般情况下不建议使用这两种事件模型,除非在一些非常老旧的系统上或者特定的环境中,没有其他更好的选择。

4、eventport(Solaris 系统)
  1. 特点:

    • Solaris 系统特有的事件模型,针对 Solaris 系统的特点进行了优化。

    • 能够有效地处理大量并发连接和事件。

  2. 使用场景:

    • 在 Solaris 系统上运行的应用程序可以考虑使用 eventport 事件模型,以充分发挥系统的性能优势。

选择事件模型时,通常应根据服务器所运行的操作系统来决定。如果在 Linux 系统上,优先选择 epoll;在 FreeBSD 和 Mac OS X 上,选择 kqueue;在 Solaris 系统上,考虑 eventport。这样可以充分利用操作系统提供的高效事件处理机制,提高 Nginx 的性能和响应速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值