nginx 配置
error_page code [=code] URL | @name 根据http响应状态码来指明特别的错误页面
可以在location中使用,
location / {
root /data/nginx;
error_page 404 =200 /404.html; 在客户端访问不存在的页面应该显示404,但是做了自定义,页面请求结果为200.
}
nginx 捕获404
在nginx.conf 配置文件中,写入location
error_page 404 /404.html;
location = /404.html {
root /data/nginx/data/404/;
}
直接跳转到指定网页
error_page 404 http://www.163.com;
基于IP的访问控制
allow
deny
例子:
location / {
root /data/nginx;
allow 172.16.0.0/16;
deny all;
}
openssl
.pem 创建一个测试证书
.key 创建私钥
.csr 创建一个签署请求
.crt 创建一个证书
[root@localhost ~]# cd /etc/pki/CA
[root@localhost CA]# (umask 077; openssl genrsa 2048> private/cakey.pem )
生成一个自签证书
openssl req -new -x509 -key provate/cakey.pem -days 3655 -out cacert.pem
cd /data/nginx/ssl
(umask 077; openssl genrsa 1024 > httpd.key)
openssl req -new -key httpd.key -out httpd.csr
签署ca
openssl ca in httpd.csr -out httpd.csr -out httpd.crt
显示状态页
stub_status {on|off}
只能用在location中
location /status {
stub_status on;
allow 172.16.0.0/24;
deny all;
}
测试状态:
curl http://172.17.0.3/status
Active connections: 1 #当前所有处于打开状态的连接数:
server accepts handled requests #第一个数字,表示已经接受过的连接, 第二个,表示已经处理过的连接,第三个表示已经处理过的请求。
1 1 1
Reading: 0 Writing: 1 Waiting: 0 # Reading: 正处于接受请求状态的连接数。 writing: 请求已经接受完成,正处于处理请求或者发送响应的过程中的连接数
waiting: 保持连接模式。
通配符
location [ =|~|~*|^~] uri { ... }
location @name { ... }
功能:允许根据用户请求的URI来匹配指定的各location以进行访问配置;匹配到时,将被location块中的配置所处理
=:精确匹配
~:正则表达式模式匹配,匹配时区分字符大小写
~*:正则表达式模式匹配,匹配时忽略字符大小写
^~:只需要前半部分与uri匹配即可,不检查正则表达式
匹配优先级:
字符字面量最精确匹配、正则表达式检索(由多个时,由第一个匹配到的所处理),按字符字面量
rewrite regex replacement flag(标志位); 重写
例如:
rewrite ^/images/(.*\.jpg)$ /imgs/$1 break(标志位);
访问jpg结尾的images文件夹 跳转到 imgs目录
$1 表示原来访问的是什么,跳转后的 文件不变
http://www.aa.com/images/a/b/c/d.jpg ----> http://www.aa.com/imgs/a/b/c/d.jpg
flag:
last: 一旦此rewrite 规则重写完成后,就不会再被后面其他的rewrite规则进行处理,而是由 user ageent重新对重写后的URL再一次发起请求,并从从开始执行类似的过程
break: 一旦此rewrite 规则重写完成后,由 user ageent重新对重写后的URL再一次发起请求,且不会再被当前localtion内的任何rewrite规则检查。
redirect: 以302响应码(临时重定向) 返回新的URL;
permanent 以301响应码(永久重定向) 返回新的URL;
location / {
rewrite ^/bbs/(*.)$ /form/$1 break;
#rewrite ^/bbs/(*.)$ https://www.abc.com/bbs/$1 redirect;
}
if 上下文
语法: if (条件) {
......
}
适用环境: server, location
条件:
1. 变量名: 变量值为空串,或者以"0" 开始,则为false, 其他均为true
2. 以变量为操作数构成的比较表达式,可以使用= != 比较操作符进行测试。
3. 正则表达式的模式匹配操作
~: 区分大小写的模式匹配检查
~*:不区分大小写的模式匹配检查
!~ 和 ~!*: 对上面两种取反
4. 测试路径为文件可能性: -f , !-f
5. 测试指定路径为目录的可能性 -d !-d
6. 测试文件的存在性: -e !-e
7. 检查文件是否有执行权限: -x , !-x
例如:
if ($http_user_agent ~* MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
防盗链
location ~* \.(jpg|gif|jpeg|png) {
valid_referer none blocked www.abc.com;#定义合法的引用
if ($invalid_referer) {
rewrite ^/ http://www.abc.com/404.html;
}
}
其他配置相关:
1. keepalive_timeout 长连接的超时时长,默认65s
2. keepalive_requests: 在一个长连接上所能够允许请求的最大资源数;
3. keepalive_disable [msie6|safari|noe] 指定类型的User Agent禁用长连接
4. tcp_nodelay on|off 是否对长连接使用tcp_nodeloay功能
5. client_header_timeourt 读取http请求报文首部的超时时长
6. client_body_timeout 读取http请求报文body部分的超时时长
7. send_timeout 发送响应报文的超时时长。
跳转
第一种方法
if ( $http_x_forwarded_for ~ ^106\.39\.49\.139|221\.122\.7\.129) { return 301 https://www.cinyi.cn$request_uri; }
第二种方法
#用变量的方式来间接实现
set $flag 0;
if ( $http_x_forwarded_for ~ ^106\.39\.49\.139|221\.122\.7\.129) {
set $flag "${flag}1";
}
if ($flag = "01") {
return 301 https://www.cinyi.cn$request_uri;
}
当访问某个php应用时,我只想让ip地址为106.39.48.139访问,其他ip都跳转到另一个页面
set $ssl_80 '' ;
if ( $request_uri ~* /abc/index.jsp ) { //客户端请求的完整请求路径
set $ssl_80 A;
}
if ( $http_x_forwarded_for !~* ^106\.39\.49\.139.* ) { //前端有负载均衡的客户端ip地址
set $ssl_80 "${ssl_80}B";
}
if ( $ssl_80 = AB ) {
#return 403;
rewrite ^(.*)$ https://www.cinyi.com permanent;
}
$request_uri是客户端请求的完整路径
$http_user_agent 是用户端发出请求的浏览器参数
$args 请求中的参数值
内置变量存放在 ngx_http_core_module 模块中,变量的命名方式和apache 服务器变量是一致的。总而言之,这些变量代表着客户端请求头的内容,例如$http_user_agent, $http_cookie, 等等。下面是nginx支持的所有内置变量: $arg_name 请求中的的参数名,即“?”后面的arg_name=arg_value形式的arg_name $args 请求中的参数值 $binary_remote_addr 客户端地址的二进制形式, 固定长度为4个字节 $body_bytes_sent 传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的“%B”参数保持兼容 $bytes_sent 传输给客户端的字节数 (1.3.8, 1.2.5) $connection TCP连接的序列号 (1.3.8, 1.2.5) $connection_requests TCP连接当前的请求数量 (1.3.8, 1.2.5) $content_length “Content-Length” 请求头字段 $content_type “Content-Type” 请求头字段 $cookie_name cookie名称 $document_root 当前请求的文档根目录或别名 $document_uri 同 $uri $host 优先级如下:HTTP请求行的主机名>”HOST”请求头字段>符合请求的服务器名 $hostname 主机名 $http_name 匹配任意请求头字段; 变量名中的后半部分“name”可以替换成任意请求头字段,如在配置文件中需要获取http请求头:“Accept-Language”,那么将“-”替换为下划线,大写字母替换为小写,形如:$http_accept_language即可。 $https 如果开启了SSL安全模式,值为“on”,否则为空字符串。 $is_args 如果请求中有参数,值为“?”,否则为空字符串。 $limit_rate 用于设置响应的速度限制,详见 limit_rate。 $msec 当前的Unix时间戳 (1.3.9, 1.2.6) $nginx_version nginx版本 $pid 工作进程的PID $pipe 如果请求来自管道通信,值为“p”,否则为“.” (1.3.12, 1.2.7) $proxy_protocol_addr 获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串。(1.5.12) $query_string 同 $args $realpath_root 当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径。 $remote_addr 客户端地址 $remote_port 客户端端口 $remote_user 用于HTTP基础认证服务的用户名 $request 代表客户端的请求地址 $request_body 客户端的请求主体 此变量可在location中使用,将请求主体通过proxy_pass, fastcgi_pass, uwsgi_pass, 和 scgi_pass传递给下一级的代理服务器。 $request_body_file 将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off, uwsgi_pass_request_body off, or scgi_pass_request_body off 。 $request_completion 如果请求成功,值为”OK”,如果请求未完成或者请求不是一个范围请求的最后一部分,则为空。 $request_filename 当前连接请求的文件路径,由root或alias指令与URI请求生成。 $request_length 请求的长度 (包括请求的地址, http请求头和请求主体) (1.3.12, 1.2.7) $request_method HTTP请求方法,通常为“GET”或“POST” $request_time 处理客户端请求使用的时间 (1.3.9, 1.2.6); 从读取客户端的第一个字节开始计时。 $request_uri 这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:”/cnphp/test.php?arg=freemouse”。 $scheme 请求使用的Web协议, “http” 或 “https” $sent_http_name 可以设置任意http响应头字段; 变量名中的后半部分“name”可以替换成任意响应头字段,如需要设置响应头Content-length,那么将“-”替换为下划线,大写字母替换为小写,形如:$sent_http_content_length 4096即可。 $server_addr 服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中。 $server_name 服务器名,www.cnphp.info $server_port 服务器端口 $server_protocol 服务器的HTTP版本, 通常为 “HTTP/1.0” 或 “HTTP/1.1” $status HTTP响应代码 (1.3.2, 1.2.2) $tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, $tcpinfo_rcv_space 客户端TCP连接的具体信息 $time_iso8601 服务器时间的ISO 8610格式 (1.3.12, 1.2.7) $time_local 服务器时间(LOG Format 格式) (1.3.12, 1.2.7) $uri 请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如”/foo/bar.html”。