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”。

 

posted @ 2017-03-31 11:22  fengjian1585  阅读(380)  评论(0编辑  收藏  举报