一、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 状态码查询
-
200 OK
:表示请求成功,服务器成功返回了请求的数据。 -
201 Created
:表示请求成功并且服务器创建了新的资源。 -
204 No Content
:表示服务器成功处理了请求,但没有返回任何内容。 -
301 Moved Permanently
:表示请求的资源已被永久移动到新的 URL,浏览器会自动重定向到新的 URL。 -
302 Found
:表示请求的资源临时被移动到了其他 URL,浏览器会重定向到该临时 URL。 301 和 302 状态码的主要区别在于 301 表示永久性重定向,而 302 表示临时性重定向。 -
304 Not Modified
:表示客户端发送了一个条件请求,服务器告诉客户端其请求的资源未被修改,客户端可以使用本地缓存。 -
400 Bad Request
:表示客户端发送的请求存在语法错误,服务器无法理解。 -
401 Unauthorized
:表示请求需要用户认证,但客户端未提供有效的认证信息。 -
403 Forbidden
:表示服务器理解请求,但拒绝执行,通常是因为客户端没有足够的权限。 -
404 Not Found
:表示服务器未找到请求的资源。 -
500 Internal Server Error
:表示服务器内部发生错误,无法完成请求。 -
502 Bad Gateway
:表示作为网关或代理的服务器从上游服务器收到了无效的响应。 -
503 Service Unavailable
:表示服务器暂时无法处理请求,通常是由于服务器过载或维护。 -
504 Gateway Timeout
:表示作为网关或代理的服务器在等待上游服务器响应时超时。
五、事件模型对比</span>
豆包AI总结!
1、epoll(Linux 系统常用)
-
特点:
-
在处理大量并发连接时非常高效。
-
采用事件触发机制,当有新的连接请求、可读或可写事件发生时,才会进行相应的处理,避免了不必要的轮询操作,从而降低了系统开销。
-
-
使用场景:
-
适用于高并发的 Web 服务器场景,尤其是在处理大量静态文件请求或反向代理等情况下表现出色。
-
如果你的服务器运行在 Linux 系统上,并且需要处理大量并发连接,epoll 通常是一个很好的选择。
-
2、kqueue(FreeBSD 和 Mac OS X 常用)
-
特点:
-
类似于 epoll,也是一种高效的事件通知机制。
-
能够快速响应网络事件,并且支持对文件描述符的高效管理。
-
-
使用场景:
-
在 FreeBSD 和 Mac OS X 系统上,如果需要处理大量并发连接,kqueue 是一个不错的选择。
-
对于运行在这些操作系统上的 Web 服务器或其他网络应用程序,kqueue 可以提供良好的性能。
-
3、select 和 poll
-
特点:
-
这两种事件模型相对较为传统,在处理大量并发连接时效率较低。
-
select 通常有最大文件描述符数量的限制,而 poll 没有这个限制,但它们在处理大量连接时都可能会出现性能瓶颈。
-
-
使用场景:
-
一般情况下不建议使用这两种事件模型,除非在一些非常老旧的系统上或者特定的环境中,没有其他更好的选择。
-
4、eventport(Solaris 系统)
-
特点:
-
Solaris 系统特有的事件模型,针对 Solaris 系统的特点进行了优化。
-
能够有效地处理大量并发连接和事件。
-
-
使用场景:
-
在 Solaris 系统上运行的应用程序可以考虑使用 eventport 事件模型,以充分发挥系统的性能优势。
-
选择事件模型时,通常应根据服务器所运行的操作系统来决定。如果在 Linux 系统上,优先选择 epoll;在 FreeBSD 和 Mac OS X 上,选择 kqueue;在 Solaris 系统上,考虑 eventport。这样可以充分利用操作系统提供的高效事件处理机制,提高 Nginx 的性能和响应速度。