Nginx

Nginx 配置 - nginx.conf

nginx.conf

http 模块

打印 log

log_format - 用来定义记录日志的格式(可以定义多种日志格式,取不同名字即可); main 名字
access_log - 用来指定日至文件的路径及使用的何种日志格式记录日志; 使用 log_format main 格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# log_format - 用来定义记录日志的格式(可以定义多种日志格式,取不同名字即可); main 名字
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 - 用来指定日至文件的路径及使用的何种日志格式记录日志; 使用 log_format main 格式
access_log logs/access.log main;

-----------------------------------------------
# 增加 '"$upstream_addr" "$upstream_status" "$upstream_response_time" "$request_time"';
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'"$upstream_addr" "$upstream_status" "$upstream_response_time" "$request_time"';

log_format格式变量:

    $remote_addr  #记录访问网站的客户端地址
    $remote_user  #远程客户端用户名
    $time_local  #记录访问时间与时区
    $request  #用户的http请求起始行信息
    $status  #http状态码,记录请求返回的状态码,例如:200、301、404等
    $body_bytes_sent  #服务器发送给客户端的响应body字节数
    $http_referer  #记录此次请求是从哪个连接访问过来的,可以根据该参数进行防盗链设置。
    $http_user_agent  #记录客户端访问信息,例如:浏览器、手机客户端等
    $http_x_forwarded_for  #当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置

增加 '"$upstream_addr" "$upstream_status" "$upstream_response_time" "$request_time"';

$upstream_addr  # 后台upstream的地址,即真正提供服务的主机地址 - 保存服务器的IP地址和端口或者是UNIX域套接字的路径。 在请求处理过程中,如果有多台服务器被尝试了,它们的地址会被拼接起来,以逗号隔开,比如: “192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock”。 如果在服务器之间通过“X-Accel-Redirect”头或者error_page有内部跳转,那么这些服务器组之间会以冒号隔开,比如:“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80”。

$upstream_status  # upstream状态 - 保存服务器的响应代码。 出现多个响应时,也是以逗号和冒号隔开。

$upstream_response_time  # 请求过程中,upstream响应时间 - 以毫秒的精度保留服务器的响应时间,(输出)单位是秒。 出现多个响应时,也是以逗号和冒号隔开。

$request_time  #整个请求的总时间 - 这个字段记录的是nginx 开始收到client 请求,到将请求发回给client 期间过去的时间。

参考资料:

路由规则重写

Location的配置语法规则

语法规则: location [=||*|^~] /uri/ {…}

语法说明:

1
2
3
4
5
* =   开头表示精确匹配,不支持正则。
* ^~ 开头表示uri以某个常规字符串开头,不支持正则,理解为匹配url路径即可。nginx不对url做编码,因此请求为/static/20%/aaa,可以被规则^~ /static/ /aaa匹配到(注意是空格)。
* ~和~* 开头表示区分大小写的和不区分大小写的正则匹配。
* !~和!~* 开头表示区分大小写不匹配及不区分大小写不匹配的正则匹配。
* / 通用匹配,任何请求都会匹配,通常放着配置的最后。

匹配优先级:

1
2
3
4
(1). 优先尝试 全匹配( 也就是前缀 =)
(2). 尝试 路径匹配 ( 也就是前缀 ^~)
(3). 尝试 正则匹配 ( 也就是前缀 ~* 或者 ~)
(4). 字符串匹配 (也就是前缀为空)

所以,前缀的优先级概括为:

1
= > ^~ > ~, ~* > 空

全匹配 > 路径匹配 > 正则匹配 > 字符串匹配

Nginx的 Rewrite 规则

语法规则: rewrite 正则 替换 标志位

rewrite指令的最后一项参数为flag标记,flag标记有:

  • 1.last last是终止当前location的rewrite检测,但会继续重试location匹配并处理区块中的rewrite规则。
  • 2.break break是终止当前location的rewrite检测,而且不再进行location匹配。
  • 3.redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址。
  • 4.permanent 返回301永久重定向,浏览器地址会显示跳转后的URL地址。
#这个指令表示,如果/login匹配成功,则直接在home路径中查找demo.html文件
#然后跳转到demo.html。注意这是内部跳转,浏览器上的地址url不会变,还是以/login结尾。
location  /login {
    rewrite  ^/  /demo.html  break;
    root  home/;
}
location /open-platform/sso-chaoxing {
    rewrite ^/  /open-platform/sso-chaoxing.html  break;
}

#和break差不多,不过这个表示外部跳转,也会跳转到demo.html页面,不过浏览器地址会自动变成demo.html
location  /login {
    rewrite  ^/  /demo.html  redirect;
    root  home/;
}

常用的Nginx全局变量

$args #这个变量等于请求行中的参数。
$content_length #请求头中的Content-length字段。
$content_type #请求头中的Content-Type字段。
$document_root #当前请求在root指令中指定的值。
$host #请求主机头字段,否则为服务器名称。 
    http://testweb.wemeet.tencent.com/test-echo
    $host: testweb.wemeet.tencent.com;
    $http_host: testweb.wemeet.tencent.com;
$http_user_agent #客户端agent信息
$http_cookie #客户端cookie信息
$limit_rate #这个变量可以限制连接速率。
$request_body_file #客户端请求主体信息的临时文件名。
$request_method #客户端请求的动作,通常为GET或POST。
$remote_addr #客户端的IP地址。
$remote_port #客户端的端口。
$remote_user #已经经过Auth Basic Module验证的用户名。
$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。
$query_string #与$args相同。
$scheme #HTTP方法(如http,https)。
$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr #服务器地址,在完成一次系统调用后可以确定这个值。
$server_name #服务器名称。
$server_port #请求到达服务器的端口号。
$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri #与$uri相同。

Tengine

新模块添加使用

1.为nginx添加模块 - 静态的模块

进入到nginx的源码包中,重新configure加入相应模块

./configure --add-module=/path/to/module

例如,我下载的一个ngx_http_push模块放到了/usr/local/ngx_modules目录里,该模块的源码目录为ngx_http_push,那么configure指令为

./configure --add-module=/usr/local/ngx_modules/ngx_http_push

configure 没问题的话那么就直接执行

make && make install 

完了以后就可以了,此时模块为静态的模块。

2.使用Tengine的dso_install

mac brew

http://localhost:8080/

重启:

//检查是否安装nginx及对应的目录
find /|grep nginx.conf

nginx -t
brew services restart nginx
// 启动Nginx
<!-- service nginx start -->
// 重启nginx
<!-- service nginx restart -->

配置文件:

/usr/local/etc/nginx/nginx.conf
// html 更目录
/usr/local/var/www/

参考资料