一、介绍
Nginx 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx的优点热部署、可以高并发链接、低内存消耗、处理响应快、具有高可靠性。
二、相关概念
正向代理:客户端配置代理服务器,进行互联网的访问。
反向代理:请求发送到反向代理服务器就会转发到真是服务器,对外暴露反向代理服务器。
负载均衡:平均分配到每个服务器上。
动静分离:动态页面和静态页面有不同的服务器进行解析。
三、Nginx的启动
在nginx的sbin目录下进行命令操作
查看版本号 ./nginx -v
启动 ./nginx
停止 ./nginx -s stop
重新加载 ./nginx -s relaod
四、nginx.conf配置文件详解
#user nobody;
worker_processes 1; # 并发处理的数量
error_log logs/error.log notice; # 错误日志和级别
pid logs/nginx.pid; # nginx启动的pid
limit_conn_zone key name :size rate # 限制传输速率
events {
worker_connections 1024; # 每个worker支持的最大连接
use epoll # 还有select poll 配置内核模型
}
http {
include mime.types;
default_type application/octet-stream;
# 日志的格式 其中$http_x_forwarded_for是记录真实的来源ip
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 logs/access.log main;
sendfile on; # 文件高效读取
tcp_nopush on; # 提高网络传输速率,必须在sendfile开启下
tcp_nodelay on # 实时性
keepalive_timeout 65;
gzip on; # 是否压缩传输
gzip_comp_level 6 # [1-9] #推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)
gzip_http_version 1.0|1.1 # 定义压缩版本
gzip_types text/plain application/xml # 压缩类型
stub_status on # 记录nginx的状态定义在server或者location下面
server {
listen 80; # 监听的接口
server_name localhost; # 提供服务器的域名
#charset koi8-r; # 编码格式
#access_log logs/host.access.log main;
location / { # 如果是~是正则表达式并且区分大小写,如果是~*就是不区分大小写,如果是=代表严格匹配
root html;
index index.html index.htm; # 默认首页
proxy_pass http://127.0.0.1:8080; # 进行转发路径,真实路径是proxy_pass+匹配规则
alias http://127.0.0.1:8080; # 别名 真是路径就是自己
autoindex on; # 列出当前文件夹的内容
autoindex_exact_size on # 显示文件的大小
autoindex_localtime on # on代表问文件服务器时间 off代表gmt时间
allow/deny address|all # 允许/拒绝,可以在http、server、location段中
expires 时间 # 设置缓存
}
}
# 放负载均衡的地址,在server块外面
upstream myserver(服务名){
server 127.0.0.1:8080;
}
}
五、Nginx负载均衡
1.轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2.weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream bakend {
server 192.168.0.14 weight=4;
server 192.168.0.15 weight=1;
}
3. ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream bakend {
ip_hash;
server ip:port;
}
4.url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backend {
server ip:port;
hash $request_uri;
hash_method crc32; # hash算法
}
5.fair(第三方组件)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
server ip:port;
fair;
}
设备的状态
down 模式表示不参与负载均衡
upstream bakend {
server ip:port down;
}
backup 预留备份服务器 不常用
upstream bakend {
server ip:port backup;
}
max_fails 允许请求失败的次数
upstream bakend {
server ip:port max_fails=10;
}
fail_timeout 经过max_fail 失败后服务暂停时间
upstream bakend {
server ip:port fail_timeout=10s;
}
max_conns 限制最大的接收连接数
upstream bakend {
server ip:port max_conns=100;
}
六、Nginx 跨域
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
七、Nginx 防盗链
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://127.0.0.1:8080/image/;
}
location ~* .+\.(js|css|png|svg|ico|jpg)$ {
valid_referers none blocked 192.168.1.8; # none 代表 "Referer" 来源头部为空的情况
# blocked "Referer"来源头部不为空,但是里面的值被代理或者防火墙删除了,这些值都不以http://或者https://开头。
# 存放白名单
if ($invalid_referer){ # 如果不合法直接404
return 404;
}
}
}
vaild_referers 有效的引用连接,如下,否则就进入$invaild_refere,返回403 forbiden。
TIPS:这里需要注意html里面的路径要保持一致。
八、Nginx 缓存
http {
// ..... 其他的配置
proxy_cache cache; // 定义缓存名称
proxy_cache_path /data/nuget-cache levels=1:2 keys_zone=nuget-cache:20m max_size=50g inactive=168h; // 缓存路径含义:路径 levels 缓存目录结构(1:2缓存两层) keys_zone 名称:10m max_size 最大饱和
proxy_cache_valid 404 1m; // 缓存过期 404缓存一分钟
proxy_cache_key $uri$is_args$args; // 缓存的内容
proxy_redirect off; // 跳转重定向
proxy_set_header Host $host; // 设置头
proxy_connect_timeout // 设置代理超时时间
proxy_no_cache 1 // 1 就是不缓存页面
server {
listen 8081;
server_name xxx.abc.com;
location / {
proxy_pass http://localhost:7878;
add_header Cache-Control max-age=no-cache; // 添加缓存
limit_req req_zone burst nodelay; // 延迟处理请求数超过burst定义的数量多余的返回503,
limit_conn zone number; // 同一时刻只允许多少个链接
}
}
limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s // 定义请求限制,在location中引用
limit_conn_zone $binary_remote_addr zone=name:size
}
九、Rewrite
作用:url地址的重写和重定向
rewrite regex(匹配到的路径) replacement 修改成 [flag]
flag的种类和区别
last 停止rewrite检测
break 停止rewrite检测
区别:last会停止当前这个请求,并根据rewrite匹配的规则重新发起一个请求。新请求又从第一阶段开始
break不会重新发起一个请求,只是跳过当前的rewrite阶段,并执行本请求后续的执行阶段
redirect 返回302 地址栏会显示重定向后的地址
permanent 返回301 地址栏会显示重定向后的地址
rewrite匹配优先级:1 执行server块的;2 执行location的;3 执行选定location块中的。
十、Nginx相关问题
nginx多个同名的server的优先级
在最前面的server优先。
多个location的优先级
= (精确的) > ^ 以什么开头 > ~ (匹配 区分大小写) > ~*(不区分大小写)
location = code/ { }
location ^code/ { }
location ~ code*/ { }
location ~* code*/ { }
alias和root的区别
root访问的是 root+匹配到的内容;alias 会把匹配到的直接转成root去进行解析。
try_files 按顺序检查文件是否存在
try_files $uri $uri/ /index.php
1. 将用户请求的uri内容是否在本地,存在则解析
2. 将请求加/, 类似重定向
3. 最后交给路径去处理(index.php)