nginx使用记录
nginx反向代理获取用户真实ip
https://www.nginx.cn/4646.html
upstream www.redis.com.cn {
ip_hash;
server serving-server1.com:80;
server serving-server2.com:80;
}
server {
listen www.redis.com.cn:80;
server_name www.redis.com.cn;
location / {
proxy_pass http://www.redis.com.cn;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
request_time and upstream_response_time
逻辑判断
概览
Nginx 中的 if/else 的语法与大多数语言一致:
if (<condition>) {
# Do something
} else {
# Do something
}
虽然 Nginx 并非编程语言,我们还是先来试试在其它语言中常用的手段吧。
但不支持逻辑运算和嵌套
if (<condition1> AND <condition2>) {
# Do something
}
if (<condition1> && <condition2>) {
# Do something
}
if (<condition1>) {
if (<condition2>) {
# Do something
}
}
正确的姿势
“与”
set $foo "";
if (<condition1>) {
set "${foo}1";
}
if (<condition2>) {
set "${foo}1";
}
if ($foo ~* "11") {
# Do something
}
首先把 $foo 清空,之后每当有一个条件成立,就会在 $foo 的结尾添加一个 1,当 $foo 中的字符串为“11”时,最后的代码块会被执行。
“或”
set $foo 0;
if (<condition1>) {
set $foo 1;
}
if (<condition2>) {
set $foo 1;
}
if ($foo = 1) {
# Do something
}
只要两个条件中有任意一个成立,$foo 就会被赋值为 1,最后一个代码块就会被执行。
另外,如果“或”用在判断的变量的值时,可以用|
更简单地解决:
if ($letter ~ ("A"|"B"|"C"|"D")) {
# Do something
}
更多个条件组合
set $foo "";
if (<condition1>) {
set $foo "1";
} else {
set $foo "0";
}
if (<condition2>) {
set $foo "${foo}1";
} else {
set $foo "${foo}0";
}
if ( $foo ~* "011" ) {
# Do something
}
开始时 $foo 是空字符串,每当一个判断成立时 $foo 的最后会被添加一个 1,不成立则添加 0,以此类推,最后一个 if 块中 $foo 要匹配的字符串就是你希望实现的判断。
Nginx 的变量字符匹配中,~*
代表匹配,!~*
代表不匹配(实际上都是正则)