【Nginx】基础 Nginx 的常用配置快速入门,助力前端er更好的进行前后端开发
配置文件示例
nginx配置文件示例
## 每个指令必须有分号结束。##
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {accept_mutex on; #设置网路连接序列化, 防止惊群现象发生,默认为on 惊群现象即多个线程都在休息 来了一个请求 所有的线程都会被叫醒,但是只有一个线程能抢到multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventportworker_connections 1024; #最大连接数,默认为512
}
http {include mime.types; #文件扩展名与文件类型映射表default_type application/octet-stream; #默认文件类型,默认为text/plain#access_log off; #取消服务日志 log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式access_log log/access.log myFormat; #combined为日志格式的默认值sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。#定义服务器列表 用于负载均衡upstream mysvr { server 127.0.0.1:7878;server 192.168.10.121:3333 backup; #热备}error_page 404 https://www.baidu.com; #错误页server {keepalive_requests 120; #单连接请求上限次数。listen 4545; #监听端口server_name 127.0.0.1; #监听地址 location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。#root path; #根目录#index index.html index.htm; #设置默认页proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表deny 127.0.0.1; #拒绝的ipallow 172.18.5.54; #允许的ip } }
}
location块
root和alias
一般来说,我们以请求路径作为文件夹路径 以后续的参数为文件名
location /static/tomcat { root /data/moon; #后面可以加/也可以不加alias /data/sun/; #后面必须加/
}
对于如上配置 发送请求xxx/static/tomcat/pic.jpg
-
root会去找
/data/moon/static/tomcat/pic.jpg
-
alias会去找
/data/sun/pic.jpg
nginx正则匹配规则
字符 | 含义 |
---|---|
^ |
匹配输入字符串的起始位置 |
$ |
匹配输入字符串的结束位置 |
* |
匹配前面的字符零次或多次 |
+ |
匹配前面的字符一次或多次 |
? |
匹配前面的字符零次或一次 |
. |
匹配除\\n之外的任何单个字符 使用[.\\n]可以匹配包括\\n在内的任意字符 |
|
转义符 |
\\d |
匹配纯数字 |
{n} |
重复n次 |
{n,} |
重复n次或更多次 |
[c] |
匹配单个字符c |
[a-z] |
匹配a-z小写字母的任意一个 |
[a-zA-Z] |
匹配a-z小写字母或A-Z大写字母的任意一个 |
() |
表达式的开始和结束位置 |
| |
或运算符 |
显示目录结构
location = /xx/ {#这个最后的/一定要带
autoindex on;#开启显示文件夹结构
autoindex_exact_size off;#显示文件大小
autoindex_localtime on;#显示文件时间
}
配置跨域
location /img/ {# 允许的源
add_header Access-Control-Allow-Origin *;#允许的请求方式
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
if ($request_method = 'OPTIONS') {return 204;
}
}
nginx全局变量
全局变量表
变量名 | 含义 |
---|---|
.$remote_addr |
用以记录客户端的ip地址 |
$http_x_forwarded_for |
|
$remote_user |
用来记录客户端用户名称 |
$time_local |
用来记录访问时间与时区 |
$request |
用来记录请求的url与http协议 |
$status |
用来记录请求状态;成功是200 |
$body_bytes_s ent |
记录发送给客户端文件主体内容大小 |
$http_referer |
用来记录从哪个页面链接访问过来的 |
$http_user_agent |
记录客户端浏览器的相关信息 |
日志详细配置
Nginx日志主要分为两种
-
access_log(访问日志)
可以应用
access_log
指令的作用域分别有http
,server
,location
,limit_except
。也就是说,在这几个作用域外使用该指令,Nginx会报错设置日志
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 设置访问日志 access_log off; # 关闭访问日志
变量 | 定义 |
---|---|
path |
指定日志的存放位置 |
format |
指定日志的格式。默认使用预定义的combined |
buffer |
用来指定日志写入时的缓存大小。默认是64k |
gzip |
日志写入前先进行压缩 从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1 |
flush |
设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空 |
if |
条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志 |
定义日志格式
log_format name [escape=default|json] string ...;
#name 格式名称。在access_log指令中引用。
#escape 设置变量中的字符编码方式是json还是default,默认是default。
#string 要定义的日志格式内容。该参数可以有多个。参数中可以使用Nginx变量
常用的日志格式中的变量
变量 | 含义 |
---|---|
$bytes_sent | 发送给客户端的总字节数 |
$body_bytes_sent | 发送给客户端的字节数,不包括响应头的大小 |
$connection | 连接序列号 |
$connection_requests | 当前通过连接发出的请求数量 |
$msec | 日志写入时间,单位为秒,精度是毫秒 |
$pipe | 如果请求是通过http流水线发送,则其值为"p",否则为“." |
$request_length | 请求长度(包括请求行,请求头和请求体) |
$request_time | 请求处理时长,单位为秒,精度为毫秒,从读入客户端的第一个字节开始,直到把最后一个字符发送张客户端进行日志写入为止 |
$status | 响应状态码 |
$time_iso8601 | 标准格式的本地时间,形如“2017-05-24T18:31:27+08:00” |
$time_local | 通用日志格式下的本地时间,如"24/May/2017:18:31:27 +0800" |
$http_referer | 请求的referer地址。 |
$http_user_agent | 客户端浏览器信息。 |
$remote_addr | 客户端IP |
$http_x_forwarded_for | 当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置。 |
$request | 完整的原始请求行,如 "GET / HTTP/1.1" |
$remote_user | 客户端用户名称,针对启用了用户认证的请求 |
$request_uri | 完整的请求地址,如 "https://daojia.com/" |
-
error_log(错误日志)
格式
error_log file [level]; Default: error_log logs/error.log error;
变量名 变量含义 file
指定日志的写入位置 level
值可为 debug, info, notice, warn, error, crit, alert,emerg 只有日志的错误级别等于或高于level指定的值才会写入错误日志中。默认值是error
nginx重定向rewrite
-
Rewrite跳转场景
-
URL看起来更规范、合理
-
企业会将动态URL地址伪装成静态地址提供服务
-
网址换新域名后,让旧的访问跳转到新的域名上
-
服务端某些业务调整
-
-
rewrite语法
rewrite <regex正则表达式> <replacement要跳转的内容> [flag可选的参数]
flag
参数
标记 | 说明 |
---|---|
last |
表示完成重写, 重写后, 马上发起一个新请求, 再次进入server块,重试location匹配,超过10次匹配不到报500错误, 浏览器地址不变 |
break |
本条规则匹配完成即终止,不再匹配后面的任务规则 |
redirect |
返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url |
permanent |
返回301永久重定向,浏览器地址会显示跳转后的URL地址,爬虫更新url |
-
重定向示例
示例
server {listen 80;server_name www.yzx020530.yzx; #域名修改 charset utf-8;access_log /var/log/nginx/yzx.access.log; #日志修改location / {#添加域名重定向if ($host = 'www.fbc.com'){ #$host为rewrite全局变量,代表请求主机头字段或主机名rewrite ^/(.*)$ http://www.new.com/$1 permanent; #$1为正则匹配的内容,即域名后边的字符串}root html;index index.html index.htm;}
}
压缩策略
# 开启gzip
gzip on;
# 开始压缩的小长度
gzip_min_length 1000;
#1k
# 压缩级别(级别越高,压的越小,越浪费CPU计算资源)
gzip_comp_level 5;
# 1-9 # 对哪些类型的文件用压缩 如txt,xml,html ,css
# jpg,png本身就是压缩格式,不建议用
gzip gzip_types text/plain application/json application/x-javascript application/css application/xml application/xml+rss text/javascript;
location /static {alias /usr/local/apps/static/dlib-19.18/;
# 显示目录 autoindex on;
}
反向代理
-
正向代理
正向代理是指客户端与目标服务器之间增加一个代理服务器,客户端直接访问代理服务器,在由代理服 务器访问目标服务器并返回客户端并返回 。这个过程当中客户端需要知道代理服务器地址,并配置连接
-
反向代理
反向代理是指客户端访问目标服务器,在目标服务内部有一个统一接入网关将请求转发至后端真正处理 的服务器并返回结果。这个过程当中客户端不需要知道代理服务器地址,代理对客户端而言是透明的
代理相关参数
proxy_pass # 代理服务
proxy_redirect off; # 是否允许重定向
proxy_set_header Host $host; # 传 header 参数至后端服务
proxy_set_header X-Forwarded-For $remote_addr; # 设置request header 即客户端IP地址
proxy_connect_timeout 90; # 连接代理服务超时时间
proxy_send_timeout 90; # 请求发送最大时间
proxy_read_timeout 90; # 读取最大时间
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
反向代理路径问题
-
绝对路径
在路径后加
/
表绝对路径,请求路径自动去掉匹配路径部分请求路径:
http://127.0.0.1/proxy/test.txt
nginx请求路径:
http://124.221.93.15:8080/test.txt
location /proxy {proxy_pass http://124.221.93.15:8080/ }
-
相对路径
在路径后不加
/
表相对路径,请求路径不去掉匹配路径部分请求路径:
http://127.0.0.1/proxy/test.txt
nginx请求路径:
http://127.0.0.1/proxy/test.txt
location /proxy {proxy_pass http://124.221.93.15:8080 }
-
添加url
在路径后添加自定义路径
请求路径:
http://127.0.0.1/proxy/test.txt
nginx请求路径:
http://124.221.93.15/static/test.txt
location /proxy {proxy_pass http://124.221.93.15:8080/static/; }
-
去掉前缀
利用rewrite实现去除前缀
"^/resource/(.)$"
:匹配路径的正则表达式,用了分组语法就是*(.)*
,把/resource/以后的所有部分当做1组/$1
:重写的目标路径,这里用$1引用前面正则表达式匹配到的分组(组编号从1开始,也就是api),即/resource/后面的所有。这样新的路径就是除去/resource/以外的所有,就达到了去除/resource前缀的目的;break:指令,重写路径结束后
location /resource {rewrite ^/resource/?(.*)$ /$1 break;proxy_pass http://124.221.93.15:8080/; # 转发地址 }
负载均衡
示例代码
示例
upstream backend {
ip_hash;
server 127.0.0.1:8088 weight=1;
server 127.0.0.1:8080 weight=1;
#server 127.0.0.1:9080 backup;
}server{listen 80; server_name localhost;
location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 反向代理 proxy_pass http://backend/; }
}
upstream参数
service #反向服务地址 加端口
weight #权重
max_fails #失败多少次 认为主机已挂掉则,踢出
fail_timeout #踢出后重新探测时间
backup #备用服务
max_conns #允许最大连接数
slow_start #当节点恢复,不立即加入,而是等待 slow_start 后加入服务对列
负载均衡算法
-
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
-
指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
-
ip_hash
每个请求按访问ip的hash结果分配 可以解决session的问题
-
least_conn
把请求转发给连接数较少的后端服务器
-
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配
-
url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端
服务器为缓存时比较有效
配置ssl证书
SSL 证书
nginx命令
命令 | 含义 |
---|---|
./nginx -v |
查看版本号 |
./nginx -t |
检查配置文件 |
/nginx -t -c conf_path |
检查conf_path路径的配置文件 |
./nginx -c conf_path |
启动conf_path路径的配置文件 |
./nginx -s stop | 暴力停止nginx |
./nginx -s quit | 优雅停止nginx 需要进程完成当前工作后再停止 |
./nginx -s reload | 重新加载配置文件 |