> 文章列表 > 【Nginx】基础 Nginx 的常用配置快速入门,助力前端er更好的进行前后端开发

【Nginx】基础 Nginx 的常用配置快速入门,助力前端er更好的进行前后端开发

【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指令的作用域分别有httpserverlocationlimit_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

  1. Rewrite跳转场景

    • URL看起来更规范、合理

    • 企业会将动态URL地址伪装成静态地址提供服务

    • 网址换新域名后,让旧的访问跳转到新的域名上

    • 服务端某些业务调整

  2. rewrite语法

    rewrite <regex正则表达式>  <replacement要跳转的内容>  [flag可选的参数]
    

flag参数

标记 说明
last 表示完成重写, 重写后, 马上发起一个新请求, 再次进入server块,重试location匹配,超过10次匹配不到报500错误, 浏览器地址不变
break 本条规则匹配完成即终止,不再匹配后面的任务规则
redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url
permanent 返回301永久重定向,浏览器地址会显示跳转后的URL地址,爬虫更新url
  1. 重定向示例

    示例

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 重新加载配置文件