Nginx状态页

location /nginx_status {
	stub_status; #显示状态
	auth_basic "auth login";
	auth_basic_user_file /www/nginx/conf/httpasswd;
	allow 10.0.0.0/24;
	allow 127.0.0.1;
	deny all;
}

Nginx第三方模块

#编译第三方模块echo
cd /root
yum install git -y
git clone https://github.com/openresty/echo-nginx-module.git
cd /www/nginx-1.20.1
./configure --prefix=/www/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module \
--add-module=/root/echo-nginx-module
make && make install 

#查看是否编译成功
nginx -V

#使用echo模块
location /data {
	index index.html;
	default_type text/html;
	echo "hello" ;
	echo $remote_addr ;
}

Nginx变量
内置变量
官方说明:http://nginx.org/en/docs/varindex.html
常用的Nginx内置的变量

$remote_addr;
#存放了客户端的地址,注意是客户端的公网IP

$proxy_add_x_forwarded_for
#此变量表示将客户端IP追加请求报文中X-Forwarded-For首部字段,多个IP之间用逗号分隔,如果请求中没有X-Forwarded-For,就使用$remote_addr

$args;
#变量中存放了URL中的参数,例如:http://www.thinkmo.org/main/index.do?id=20190221&partner=search
#返回结果为: id=20190221&partner=search

$document_root;
#保存了针对当前资源的请求的系统根目录,例如:/www/nginx/html

$document_uri;
#保存了当前请求中不包含参数的URI,注意是不包含请求的指令,比如:http://www.thinkmo.org/main/index.do?id=20190221&partner=search会被定义为/main/index.do
#返回结果为:/main/index.do

$host;
#存放了请求的host名称

limit_rate 10240;
echo $limit_rate;
#如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置,则显示0

$remote_port;
#客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口

$remote_user;
#已经经过Auth Basic Module验证的用户名

$request_body_file;
#做反向代理时发给后端服务器的本地资源的名称

$request_method;
#请求资源的方式,GET/PUT/DELETE等

$request_filename;
#当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径

$request_uri;
#包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args

$scheme;
#请求的协议,例如:http,https,ftp等

$server_protocol;
#保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等

$server_addr;
#保存了服务器的IP地址

$server_name;
#请求的服务器的主机名

$server_port;
#请求的服务器的端口号

$http_<name>
#name为任意请求报文首部字段,表示记录请求报文的首部字段
arbitrary request header field; the last part of a variable name is the field
name converted to lower case with dashes replaced by underscores #用下划线代替横线
#示例: echo $http_User_Agent;

$http_user_agent;
#客户端浏览器的详细信息

$http_cookie;
#客户端的cookie信息

$cookie_<name>
#name为任意请求报文首部字部cookie的key名

自定义变量
假如需要自定义变量名称和值,使用指令set $variable value;

Syntax: set $variable value;
Default: —
Context: server, location, if

set $name thinkmo;
echo $name;

Nginx自定义访问日志
自定义默认格式日志

#默认的日志格式
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

10.0.0.1 - - [05/Nov/2021:14:40:55 +0800] "GET /data HTTP/1.1" 200 24 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"

自定义json格式日志
Nginx 的默认访问日志记录内容相对比较单一,默认的格式也不方便后期做日志统计分析,生产环境中通常将nginx日志转换为json日志,然后配合使用ELK做日志收集-统计-分析。

log_format access_json '{"@timestamp":"$time_iso8601",'
		'"host":"$server_addr",'
		'"clientip":"$remote_addr",'
		'"size":$body_bytes_sent,'
		'"responsetime":$request_time,' #总的处理时间
		'"upstreamtime":"$upstream_response_time",'
		'"upstreamhost":"$upstream_addr",' #后端应用服务器处理时间
		'"http_host":"$host",'
		'"uri":"$uri",'
		'"xff":"$http_x_forwarded_for",'
		'"referer":"$http_referer",'
		'"tcp_xff":"$proxy_protocol_addr",'
		'"http_user_agent":"$http_user_agent",'
		'"status":"$status"}';

Nginx压缩功能
Nginx对文件的压缩功能是依赖于模块ngx_http_gzip_module

#启用或禁用gzip压缩,默认关闭
gzip on | off;

#压缩比由低到高从1到9,默认为1
gzip_comp_level level;

#禁用IE6 gzip功能
gzip_disable "MSIE [1-6]\.";

#gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;

#启用压缩功能时,协议的最小版本,默认HTTP/1.1
gzip_http_version 1.0 | 1.1;

#指定Nginx服务需要向服务器申请的缓存空间的个数和大小,平台不同,默认:32 4k或者16 8k;
gzip_buffers number size;

#指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错
gzip_types mime-type ...;

#如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开
gzip_vary on | off;

https加密
nginx的https功能基于模块ngx_http_ssl_module实现,因此如果是编译安装的nginx要使用参数ngx_http_ssl_module开启ssl功能,但是作为nginx的核心功能,yum安装的nginx默认就是开启的,编译安装的nginx需要指定编译参数--with-http_ssl_module开启

ssl on | off;
listen 443 ssl;
#为指定的虚拟主机配置是否启用ssl功能,此功能在1.15.0废弃,使用listen [ssl]替代

ssl_certificate /path/to/file;
#指向包含当前虚拟主机和CA的两个证书信息的文件,一般是crt文件

ssl_certificate_key /path/to/file;
#当前虚拟主机使用的私钥文件,一般是key文件

ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
#支持ssl协议版本,早期为ssl现在是TLS,默认为后三个

ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
#配置ssl缓存

off: #关闭缓存
none: #通知客户端支持ssl session cache,但实际不支持
builtin[:size]:#使用OpenSSL内建缓存,为每worker进程私有
[shared:name:size]:#在各worker之间使用一个共享的缓存,需要定义一个缓存名称和缓存空间大小,一兆可以存储4000个会话信息,多个虚拟主机可以使用相同的缓存名称

ssl_session_timeout time;
#客户端连接可以复用ssl session cache中缓存的有效时长,默认5m

ngx_http_rewrite_module模块指令
if指令

用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:
if (条件匹配) {
	action
}

使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使用以下符号链接:

= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false

location /main {
	index index.html;
	default_type text/html;
	if ( $scheme = http ){
		echo "if-----> $scheme";
	}
	if ( $scheme = https ){
		echo "if ----> $scheme";
	}
}

set指令
指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key value,value可以是text, variables和两者的组合。

break指令
用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的ngx_http_rewrite_module 模块中指令就不再执行,Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和locationif块中使用

注意: 如果break指令在location块中后续指令还会继续执行,只是不执行ngx_http_rewrite_module 模块的指令,其它指令还会执行

location /main {
	root /www/nginx/html;
	index index.html;
	default_type text/html;
	set $name thinkmo;
	echo $name;
	break; #location块中break后面指令还会执行
	set $my_port $server_port;
	echo $my_port;
}

return指令
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置

return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号
return code URL; #返回给客户端的URL地址

rewrite_log指令

设置是否开启记录ngx_http_rewrite_module 模块日志记录到 error_log日志文件当中,可以配置在http、server、location 或 if 中

注意: 需要日志级别为 notice

location /main {
	index index.html;
	default_type text/html;
	set $name thinkmo;
	echo $name;
	rewrite_log on;
	break;
	set $my_port $server_port;
	echo $my_port;
}

rewrite指令

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理

rewrite可以配置在 server、location、if
rewrite regex replacement [flag];

rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI

注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制

如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向 301

正则表达式格式

. #匹配除换行符以外的任意字符
\w #匹配字母或数字或下划线或汉字
\s #匹配任意的空白符
\d #匹配数字
\b #匹配单词的开始或结束
^ #匹配字付串的开始
$ #匹配字符串的结束

  • #匹配重复零次或更多次
  • #匹配重复一次或更多次
    ? #匹配重复零次或一次
    (n) #匹配重复n次
    {n,} #匹配重复n次或更多次
    {n,m} #匹配重复n到m次
    *? #匹配重复任意次,但尽可能少重复
    +? #匹配重复1次或更多次,但尽可能少重复
    ?? #匹配重复0次或1次,但尽可能少重复
    {n,m}? #匹配重复n到m次,但尽可能少重复
    {n,}? #匹配重复n次以上,但尽可能少重复
    \W #匹配任意不是字母,数字,下划线,汉字的字符
    \S #匹配任意不是空白符的字符
    \D #匹配任意非数字的字符
    \B #匹配不是单词开头或结束的位置
    [^x] #匹配除了x以外的任意字符
    [^thinkmo] #匹配除了thinkmo 这几个字母以外的任意字符

rewrite flag使用介绍
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrtie有四种不同的flag,分别是redirect(临时重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型

 跳转型指由客户端浏览器重新对新地址进行请求
 代理型是在WEB服务器内部实现跳转

rewrite 格式

Syntax: rewrite regex replacement [flag]; #通过正则表达式处理用户请求并返回替换后的数据包。
Default: —
Context: server, location, if

flag 说明

redirect;
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;
使用相对路径,或者http://或https://开头,状态码:302

permanent;
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301,客户端会记录此次的重定向

break;
#重写完成后,停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用
#适用于一个URL一次重写

last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户

额外说明:

break 适用于不改变客户端访问方式,但是要将访问的目的URL做单次重写的场景,比如:有V1/V2两个版本的网站前端页面并存,旧版本的网站数据在statics,还不能丢失,但是要将访问新版本的请求重写到新的静态资源路径static
last 适用于要不改变客户端访问方式但是需做多次目的URL重写的场景,使用场景不是很多。

使用rewrite自动跳转为https

#针对全站跳转
location / {
root /data/nginx/html/pc;
index index.html;
if ($scheme = http ){ #如果没有加条件判断,会导致死循环
rewrite / https://$host redirect;
}
}

#针对特定的URL进行跳转https
location /login {
if ($scheme = http ){
rewrite / https://$host/login redirect;
}
}

上一篇 下一篇