nginx小结
nginx启动与基础配置
nginx 常用命令:
nginx
#立即停止
nginx -s stop
#执行完当前请求再停止
nginx -s quit
#重新加载配置文件,相当于restart
nginx -s reload
#将日志写入一个新的文件
nginx -s reopen
#测试配置文件
nginx -t日志文件位于/var/log/nginx/
配置文件位于/etc/nginx/nginx.conf,
root@5eb4d1b40551:/etc/nginx# cat nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
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;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
配置文件中的include /etc/nginx/conf.d/*.conf语句会引用/etc/nginx/conf.d下的所有.conf文件,这样可以保持主配置文件的简洁,同时配个多个.conf文件方便区分,增加可读性。
2.nginx常用命令总结:
一个conf文件中可以有多个server监听,比如:
# curl http://localhost:80 会访问这个
server {
listen 80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
# curl http://nginx-dev:80 会访问这个
server{
listen 80;
server_name nginx-dev;#主机名
location / {
root /home/AdminLTE-3.2.0;
index index.html index2.html index3.html;
}
}其中listen字段可以配置成IP或端口或IP+端口
server_name主要用于区分,可以随便起。
location
/请求指向 root 目录
location 总是从/目录开始匹配,如果有子目录,例如/css,他会指向/static/css
location /css {
root /static;
}路径拼接规则是root/location
3.HTTP反向代理
正向代理:在客户端代理转发请求称为正向代理。例如VPN。
反向代理:在服务器端代理转发请求称为反向代理。例如nginx
配置文件配置:
server {
listen 8001;
server_name ruoyi.localhost;
location /ltem {
proxy_pass http://localhost:8088;
index page.html
}
}访问8001端口或者http://ruoyi.localhost:8001将自动转发到http://localhost:8088
如果proxy-pass的地址只配置到端口,不包含/或其他路径,那么location将被追加到转发地址中即访问http://ruoyi.localhost:8001/ltem ->http://localhost:8088/ltem
如果conf文件中的proxy-pass包括其他路径,那么location就不会生效
server {
listen 8001;
server_name ruoyi.localhost;
location /some/path/ {
proxy_pass http://localhost:8080/zh-cn/;
index page.html
}
}http://ruoyi.localhost:8001/some/path/page.html ->http://localhost:8088/zh-cn/page.html
而且如果我们在代理时需要获取被代理的主机信息时,就需要设置header信息
设置代理请求headers
用户可以重新定义或追加header信息传递给后端服务器。可以包含文本、变量及其组合。默认情况下,仅重定义两个字段:
#默认情况下:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
#反向代理的header信息
location /some/path/ {
#nginx的主机地址
proxy_set_header Host $http_host;
#用户端真实的IP,即客户端IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8088;
}常用变量的值:
$host:nginx主机IP,例如192.168.56.105
$http_host:nginx主机IP和端口,192.168.56.105:8001
$proxy_host:localhost:8088,proxy_pass里配置的主机名和端口
$remote_addr:用户的真实IP,即客户端IP。
非HTTP代理
如果要将请求传递到非 HTTP 代理服务器,可以使用下列指令:
fastcgi_pass 将请求转发到FastCGI服务器(多用于PHP)
scgi_pass 将请求转发到SCGI server服务器(多用于PHP)
uwsgi_pass 将请求转发到uwsgi服务器(多用于python)
memcached_pass 将请求转发到memcached服务器
动静分离
动静分离的作用
将静态文件交给nginx处理,可以提高系统的访问速度,减少网络如tomcat的请求次数,有效的给后端服务器降压。
location用法:
server{
location / {
proxy_pass http://localhost:8080/;
}
location = /html/ie.html {
root /home/www/static;
}
location ^~ /fonts/ {
root /home/www/static;
}
location ~ \.(css|js|png|jpg|gif|ico) {
root /home/www/static;
}location 修饰符
location可以使用修饰符或正则表达式
修饰符:
= 等于,严格匹配 ,匹配优先级最高。
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。优先级第二高。
~ 区分大小写
~* 不区分大小写
优先级从高到低依次为:。
精确匹配(=)
前缀匹配(^~)
正则匹配(~和~*)
不写
比如要将/images/1.jpg代理到 http://localhost:8080/images/1.jpg 将/some/path/1.jpg 代理到http://localhost:8080/some/path/1.jpg
写法如下:
location ^~ /images/ {
proxy_pass http://localhost:8080;
}
location ~ \.jpg {
proxy_pass http://localhost:8080;
}/images/1.jpg`代理到 `http://localhost:8080/images/1.jpg
/some/path/1.jpg` 代理到`http://localhost:8080/some/path/1.jpg缓冲(buffer)和缓存(cache)
使用缓冲的场景:服务端与客户端链接不稳定。
客户端往往是用户网络,情况复杂,可能出现网络不稳定,速度较慢的情况。
而nginx到后端server一般处于同一个机房或者区域,网速稳定且速度极快。
如果禁用了缓冲,则在客户端从代理服务器接收响应时,响应将同步发送到客户端。对于需要尽快开始接收响应的快速交互式客户端,此行为可能是可取的。
这就会带来一个问题:因为客户端到nginx的网速过慢,导致nginx只能以一个较慢的速度将响应传给客户端;进而导致后端server也只能以同样较慢的速度传递响应给nginx,造成一次请求连接耗时过长。
在高并发的情况下,后端server可能会出现大量的连接积压,最终拖垮server端。
解决方案:开启代理缓冲
开启代理缓冲后,nginx可以用较快的速度尽可能将响应体读取并缓冲到本地内存或磁盘中,然后同时根据客户端的网络质量以合适的网速将响应传递给客户端。这样既解决了server端连接过多的问题,也保证了能持续稳定的像客户端传递响应。
proxy_buffering off; --> proxy_buffering on;proxy_buffers 指令设置每个连接读取响应的缓冲区的大小和数量 。默认情况下,缓冲区大小等于一个内存页,4K 或 8K,具体取决于操作系统。
来自后端服务器响应的第一部分存储在单独的缓冲区中,其大小通过 proxy_buffer_size 指令进行设置,此部分通常是相对较小的响应headers,通常将其设置成小于默认值。
location / {
proxy_buffers 16 4k;
proxy_buffer_size 2k;
#如果整个响应不适合存到内存里,则将其中的一部分保存到磁盘上的临时文件中。
#设置临时文件的最大值。
proxy_max_temp_file_size 1024k
#设置一次写入临时文件的大小。
proxy_temp_file_write_size 2k
proxy_pass http://localhost:8088;
}缓存(cache)
启用缓存后,nginx将响应保存在磁盘中,返回给客户端的数据首先从缓存中获取,这样子相同的请求不用每次都发送给后端服务器,减少到后端请求的数量。
启用缓存,需要在http上下文中使用 proxy_cache_path 指令,定义缓存的本地文件目录,名称和大小。
缓存区可以被多个server共享,使用proxy_cache 指定使用哪个缓存区。
http {
proxy_cache_path /data/nginx/cache keys_zone=mycache:10m;
server {
proxy_cache mycache;
location / {
proxy_pass http://localhost:8000;
}
}
}缓存目录的文件名是 proxy_cache_key 的MD5值。
例如:/data/nginx/cache/**c**/**29**/b7f54b2df7773722d382f4809d650**29c**
proxy_cache_key 默认设置如下:
proxy_cache_key $scheme$proxy_host$uri$is_args$args;也可以自定义缓存的键,例如
proxy_cache_key "$host$request_uri$cookie_user";缓存不应该设置的太敏感,可以使用proxy_cache_min_uses设置相同的key的请求,访问次数超过指定数量才会被缓存。
proxy_cache_min_uses 5;默认情况下,响应无限期地保留在缓存中。仅当缓存超过最大配置大小时,按照时间删除最旧的数据。

缓冲和缓存的区别:
缓冲只针对单个请求的响应,将请求的响应存储到内存中,请求结束buffer清空,优化的是单个请求的响应时间,并不会减少nginx到后端的访问数量。
缓存是针对应用运行的整个阶段存在的,nginx会将不同的请求的响应存放到nginx缓存中,这样相同的请求访问时直接从本地缓存返回请求返回值。
使用缓存和缓冲的示例:
proxy_cache_path /var/cache/nginx/data keys_zone=mycache:10m;
server {
listen 8001;
server_name ruoyi.localhost;
location / {
#设置buffer
proxy_buffers 16 4k;
proxy_buffer_size 2k;
proxy_pass http://localhost:8088;
}
location ~ \.(js|css|png|jpg|gif|ico) {
#设置cache
proxy_cache mycache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
proxy_pass http://localhost:8088;
}
location = /html/ie.html {
proxy_cache mycache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
proxy_pass http://localhost:8088;
}
location ^~ /fonts/ {
proxy_cache mycache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
proxy_pass http://localhost:8088;
}
}负载均衡
负载平衡是一种常用技术,用于优化资源利用率、最大化吞吐量、减少延迟和确保容错配置。使用nginx作为非常有效的HTTP负载平衡器,将流量分配到多个应用程序服务器,可以提升Web应用程序的性能,提高扩展性和可靠性。

使用 upstream定义一组服务 。
#upstream 位于 http上下文中,与server 并列,不要放在server中。
upstream ruoyi-apps {
#不写,采用轮循机制
server localhost:8080;
server localhost:8088;
}
server {
listen 8003;
server_name ruoyi.loadbalance;
location / {
proxy_pass http://ruoyi-apps;
}
}负载均衡的策略
不写默认是采用轮循机制
最小链接
upstream backend {
least_conn;
server localhost:8080;
server localhost:8088;
}
#使用轮循机制或最少连接的负载平衡,不能保证同一客户端将始终定向到同一服务器ip-hash
upstream backend {
ip_hash;
server localhost:8080;
server localhost:8088;
}
#此方法可确保来自同一客户端的请求将始终定向到同一服务器,除非此服务器不可用。hash
upstream backend {
#consistent参数启用 ketama 一致哈希算法,如果在上游组中添加或删除服务器,只会重新映射部分 键,从而最大限度地减少缓存失效。
hash $request_uri consistent;
server localhost:8080;
server localhost:8088;
}
#基于 IP 的哈希算法存在一个问题,那就是当有一个上游服务器宕机或者扩容的时候,会引发大量的路由变更,进而引发连锁反应,导致大量缓存失效等问题。


随机
每个请求都将传递到随机选择的服务器。
two是可选参数,NGINX 在考虑服务器权重的情况下随机选择两台服务器,然后使用指定的方法选择其中一台,默认为选择连接数最少(least_conn)的服务器。
upstream backend {
random two least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
server backend4.example.com;
}权重
upstream my-server {
server backend1.example.com weight=3;
server backend2.example.com;
server backend3.example.com;
}
#每 5 个新请求将按如下方式分布在应用程序实例中:3 个请求将定向到performance.server,一个请求将转到app1.server,另一个请求将转到app2.server。健康检查
在反向代理中,如果后端服务器在某个周期内响应失败次数超过规定值,nginx会将此服务器标记为失败,并在之后的一个周期不再将请求发送给这台服务器。
通过fail_timeout 来设置检查周期,默认为10秒。
通过max_fails来设置检查失败次数,默认为1次。
在以下示例中,如果NGINX无法向 backend2.example.com 服务器发送请求或在30秒内请求失败次数超过3次,则会将服务器标记为不可用30秒。
upstream backend {
server backend1.example.com;
server backend2.example.com max_fails=3 fail_timeout=30s;
} https配置
配置ssl
server {
listen 443 ssl;
server_name ruoyi.https;
#ssl_certificate 证书存放目录
ssl_certificate /home/ssl/server.crt;
# 证书key存放目录
ssl_certificate_key /home/ssl/server.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
#如果设置了密码,需要加上
ssl_password_file /home/ssl/cert.pass;
location / {
proxy_pass http://localhost:8088;
}
}https优化
SSL 操作会消耗额外的 CPU 资源。CPU 占用最多的操作是 SSL 握手。有两种方法可以最大程度地减少每个客户端的这些操作数:
使保持活动连接能够通过一个连接发送多个请求
重用 SSL 会话参数以避免并行连接和后续连接的 SSL 握手
会话存储在工作进程之间共享并由 ssl_session_cache 指令配置的 SSL 会话缓存中。一兆字节的缓存包含大约 4000 个会话。默认缓存超时为 5 分钟。可以使用 ssl_session_timeout 指令增加此超时。以下是针对具有 10 MB 共享会话缓存的多核系统优化的示例配置:
server {
listen 443 ssl;
server_name ruoyi.https;
#ssl_certificate 证书存放目录
ssl_certificate /home/ssl/server.crt;
# 证书key存放目录
ssl_certificate_key /home/ssl/server.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
#如果设置了密码,需要加上
ssl_password_file /home/ssl/cert.pass;
#使用会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location / {
proxy_pass http://localhost:8088;
}
}TCP反向代理
#HTTP代理
http {
server {
listen 8002;
proxy_pass http://localhost:8080/;
}
}
#TCP代理
stream {
upstream backend-mysql {
server localhost:3306;
server localhost:3307;
#使用keepalive定义连接池里空闲连接的数量。
keepalive 8;
}
server {
listen 13306;
proxy_pass backend-mysql;
}
}keepalive就是Java中的线程池,使用 keepalive 指令启用从 NGINX Plus 到上游服务器的保持活动连接,定义在每个工作进程的缓存中保留的与上游服务器的空闲保持活动连接的最大数量。当超过此数字时,将关闭最近最少使用的连接。如果没有 keepalives,您将增加更多的开销,并且连接和临时端口都效率低下。
现代 Web 浏览器通常会打开 6 到 8 个保持连接。
重写(return和rewrite)
nginx有两个重写指令:return和rewrite
return
服务端停止处理并将状态码status code返回给客户端
return code URL
return code text
return code
return URL转发和重定向
转发是服务端行为,重定向是客户端行为。
反向代理proxy_pass属于转发,浏览器的访问栏输入的地址不会发生变化。
return,rewrite属于重定向,在客户端进行。浏览器的访问栏输入的地址会发生变化。
例:将请求从 www.old-name.com old-name.com 永久重定向到 www.new-name.com,包含http和https请求
server {
listen 80;
listen 443 ssl;
server_name www.old-name.com old-name.com;
return 301 $scheme://www.new-name.com$request_uri;
}rewrite
可以按照指定的正则表达式与请求 URI 匹配,则 URI 将按照字符串中的指定进行更改。指令按其在配置文件中出现的先后顺序执行。
server {
# ...
rewrite ^(/download/.*)/media/(\w+)\.?.*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(\w+)\.?.*$ $1/mp3/$2.ra last;
return 403;
# ...
}nginx正则表达式以^开头 $结尾
上面是使用该指令的示例 NGINX 重写规则。它匹配以字符串 /download 开头的 URL,然后在路径后面的某个位置包含 /media/ 或 /audio/ 目录。它将这些元素替换为 /mp3/,并添加相应的文件扩展名,.mp3 或 .ra。和 变量捕获未更改的路径元素。例如,/download/cdn-west/media/file1 变成了 /download/cdn-west/mp3/file1.mp3。如果文件名上有扩展名(如 .flv),则表达式会将其剥离,并将其替换为.mp3。
rewrite效果等价于使用location,只是选择更多更多样,可以直接让客户端更改请求,具体还要根据last和break结合使用。
评论区