Nginx入门
基础
https://blog.csdn.net/weixin_40792878/article/details/83316519
快速入门
Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强;
- 代理:用于隐藏客户端或者目标服务器,是客户端和目标服务器的桥梁
- 反向代理:反向代理可以隐藏原始服务器;代理服务器来接受客户端的网络访问连接请求(此时代理服务器本质就是目标服务器),然后交由业务服务器进行处理;实现服务对于客户端的单向透明
- 正向代理:正向代理可以隐藏客户端,本质就是客户端通过代理服务器访问目标服务端,代理服务器作为目标服务器的真实客户端进行访问;实现了客户端对于服务端的单向透明;(例如VPN和内网的网关服务器)
- 反向代理:反向代理可以隐藏原始服务器;代理服务器来接受客户端的网络访问连接请求(此时代理服务器本质就是目标服务器),然后交由业务服务器进行处理;实现服务对于客户端的单向透明
基础概念
- 文件目录
- config:配置文件
- sbin:程序
- logs:日志
- html:静态文件
- 配置文件
- nginx.conf:主配置文件
- Master-Worker模式
- master进程:管理子进程、读取Nginx.conf配置文件
- worker进程:业务进程(处理客户端请求)
- 每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;
使用
- .default:默认配置文件(用于还原)
- fastcgi.conf:为了规范配置指令SCRIPT_FILENAME的用法,引入FastCGI变量传递配置。
- scgi_params:Nginx在配置SCGI代理服务时会根据scgi_params文件的配置向SCGI服务器传递变量。
- uwsgi_params:Nginx在配置uWSGI代理服务时会根据uwsgi_params文件的配置向uWSGI服务器传递变量。
主配置文件
Nginx.conf
-
user nginx; #用户 worker_processes auto; #worker进程树 error_log /var/log/nginx/error.log; #错误日志 pid /run/nginx.pid; #进程id #导入所有nginx的配置文件 include /usr/share/nginx/modules/*.conf; #事件配置 events { worker_connections 1024; } #http配置 http { 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; #tcp设置 sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; #导入请求响应(响应数据的格式)的配置文件 #mime.types配置:文件格式和文件后缀名的映射 include /etc/nginx/mime.types; #默认格式 default_type application/octet-stream; include /etc/nginx/conf.d/*.conf; upstarem 组名 { server ip:port <weight=number> <backup> server ip:port <weight=number> <backup> …… } #server配置:配置业务服务和代理URI的映射 server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { proxy_pass http://ip:port; #配置业务处理服务器 root /www/index.html #配置当前目录下处理(返回静态页面)。显然如果配置了proxy_pass将失效 } # 错误页面 响应码 error_page 404 /404.html; location = /40x.html { } # 错误页面 响应码 error_page 500 502 503 504 /50x.html; location = /50x.html { } }
-
配置文件
-
main:服务器全局配置
- 例如前面的worker数目、日志等
-
events:连接事件配置
- Nginx 服务器与用户的网络连接配置
-
http:http配置
-
http全局块:主要配置TCP连接、响应
- 包括文件引入、 MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
-
server:虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的
-
server全局块:虚拟主机服务器配置(包括监听的端口等)
-
upstraem模块:配置业务服务器组名和服务器组的映射
-
upstarem 组名 { # weight:设置服务权重(被调用的概率) backup:开启备份服务器 server ip:port <weight=number> <backup> server ip:port <weight=number> <backup> …… }
-
-
location块:设定URL和处理器的映射(通过proxy_pass或root进行映射);对特定的请求进行处理;
location / { #检测http的header的referes是否存在,且为指定的域名/端口;主要是防盗链 #valid_referes <拒绝策略> 域名/ip <拒绝处理handler> #例如:valid_referes none 111.111.11.1; #if($valid_referes) return 403; #URL重写;可以通过if(condition){…} 判断是否需要重写 #rewrite <regex> <replacement> [flag]; #例如将所有http请求变为https请求 #rewrite ^(.*) https://$server_name$1 redirect; proxy_pass http://ip:port; #配置直接指定业务处理服务器 proxy_pass http://组名; #配置业务处理服务器组,由upstream决定业务服务器 #root /www/index.html #配置当前目录下处理(返回静态页面)。显然如果配置了proxy_pass将失效 }
-
-
mine配置文件
- 配置响应数据的格式:Content-Type: XXX;
types {
#格式 文件后缀名;没有配置,但是有该类型则需要在文件中配置,例如返回数据有MP3
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
#
video/mp4 mp4;
audio/mpeg mp3;
#application/octet-stream:下载
application/octet-stream bin exe dll;
}
主要配置
负载均衡
-
轮询(默认)
-
权重
- 直接在upstream设置server的weight
-
响应时间
-
最少连接数
-
hash
URL重写
https://blog.csdn.net/weixin_44953658/article/details/106314558
防盗链
配置语法
- 前面学习了基本配置,下面介绍配置语法
- 通过
;
设置指令的结束标记 - 通过
{}
标记指令的作用域 - 支持变量、if
- 支持单位
- 容量单位
- 时间单位
- 变量数据类型
- 字符串
- 数值
- map:前面的mimes的types就是hash表
网关
- Nginx可以作为服务网关,并且进行:高可用和系统容错配置
- 负载均衡
- 限流
- 安全
限流配置
-
分布式理论学过:
- 限流主要有三种思路:时间段分区分配、漏桶算法、令牌桶;
- 实现思路基本是:统计区+算法
- ngnix(和sentinel类似)也是基于:AQS和连接数进行限流处理
-
配置策略:
算法 统计区
- limit_conn_zone:连接数
- limit_req_zone:请求数
- ngx_http_upstream_module
#限流策略:<请求/连接数> <key> zone=<共享内存(统计区)名>:<内存大小> <限流参数> #使用,一般在http定义,在具体的server/location中通过 共享内存(统计区)名调用 #通过请求数+请求的ip作为限流依据 #$binary_remote_addr:连接的ip地址的散列结果作为key limit_conn_zone $binary_remote_addr zone=perip:10m #perip统计区大小为10M #$binary_remote_addr:连接的server作为key limit_conn_zone $server_name zone=perserver:10m #perserver统计区大小为10M server { limit_conn perip 10; #每个ip最多10连接连接该server limit_conn perserver 100; #每个server最多100有连接该server } #AQS限流 limit_req_zone $server_name zone=req_one:10m rate=20r/s; server { location / { limit_req zone=req_one; #相当漏斗限流(固定流速 #limit_req zone=myRateLimit burst=20; 相当于分区限流,若同时有21个请求到达,Nginx 会处理第一个请求,剩余20个请求将放入队列,然后每隔100ms从队列中获取一个请求进行处理。若请求数大于21,将拒绝处理多余的请求,直接返回503. #limit_req zone=myRateLimit burst=20 nodelay;相当于令牌桶限流,最多有20个令牌,每rom都会添加令牌 proxy_pass http://xxxxx; } }
服务网关
- 微服务设置防火墙只允许ngnix服务器访问,所有服务必须通过ngnix才能访问
- ngnix通过设置访问白名单,进行限制访问
#设置只允许某些IP访问 例如111.111.11.1 111.111.11.1
allow 111.111.11.1;
allow 111.111.11.11;
#设置禁止某些IP访问 例如 111.2222.33.0
deny 111.2222.33.0;
geo $limit {
default 1;
10.0.0.0/8 0;
192.168.0.0/24 0;
172.20.0.35 0;
}
map $limit $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=myRateLimit:10m rate=10r/s