NGINX中以$开头的字符串为变量对象
变量形态
未索引类变量,诸如 a r g , arg, arg,arg_*, c o o k i e ∗ , cookie_*, cookie∗,http_*等可被重新赋值
未索引值的是当用户调用时候去启动一个内置程序去获取当前的值,并不是提前预先索引好
location /internal {
set $orig_args $args;
set $args "changed=1&result+1";
set $orig_testheader $http_testheader;
set $http_testheader "had-chaged-header-value";
return 200 "Original arg:$orig_args , But last nginx internal args is:$args ||| Original testheader: $orig_testheader,But last nginx internal header: $http_testheader";
}
server {
listen 80;
return https://$host$request_uri
}
server {
listen 443 ssl;
proxy_pass http://example.com:8080$request_uri;
}
NGINX所有内置变量
SET指令用来自定义变量
#example
set $variable_name
value;
set $foo "hello world";
set $bar 101;
set $combo $foo;
##example
location /noset {
return 200 "F5: $f5";
}
location /set {
set $f5 "nginx is part of F5";
return 200 "F5: $f5";
}
curl http://172.16.100.252:8080/noset
F5:
C:\Users\jlin
curl http://172.16.100.252:8080/set
F5: nginx is part of F5
#example
localtion /main_auth_request {
set $var "/";
auth_request /sub_auth;
proxy_pass http://192.168.2.71:80$var;
}
location /sub_auth {
set $var "/get404fromcnadn";
return 200 "sub request";
}
最后服务器收到的请求uri是http://192.168.2.71:80/get404fromcnadn,如果将/sub_auth下的$var设置为/则不会返回404
内置变量与子请求
基于源变量值的匹配来赋值结果变量($result-variable)
#example
map $source-variable $result-variable {
default foo
f5 ltm
f4 shancai
源变量的值匹配:
结果变量赋值
问题:如果一个请求的session cookie不存在,则取样1%的这样请求记录到access.log里
#example
map $cookie_SESSION $logme {
"" $perhaps;
default 0;
}
split_clients $request_id $perhaps {
1% 1; # $perhaps is true 1% of the time
* 0;
}
server {
listen 80;
access_log /var/log/nginx/secure.log notes if=$logme;
...
map与geo指令类似,在一次上请求上下文中会被缓存
#example
map $args $test {
default 0;
debug 1;
}
localtion /maptest {
set $orig_test $test;
set $args debug;
return 200 "orginal test mapping value: $orig_test ||| After changing args, the test mapping alue is: $test";
}
curl http://192.168.2.73:8080/maptest
orginal test mapping value: 0 ||| After changing args, the test mapping alue is: 0
1.11.7版本后增加了缓存控制参数 volatile
#example
map $args $test {
volatile;
default 0;
debug 1;
}
localtion /maptest {
set $orig_test $test;
set $args debug;
return 200 "orginal test mapping value: $orig_test ||| After changing args, the test mapping alue is: $test";
}
curl http://192.168.2.73:8080/maptest
orginal test mapping value: 0 ||| After changing args, the test mapping alue is: 1
Variable | Definition |
---|---|
$upstream_connect_time | Connecion to upstream/backend |
$upstream_header_time | First byte response header |
$upstream_response_time | Last byte response body |
$request_time | Total time of request |
以上变量没有默认的加入到日志中,需要在log_format指令中手工加入
前提:在配置中启用api location
API作用:
demo体验
api地址
#example
server {
listen 8080;
set $apimgmt_entry_point -;
location /api {
api write=on;
}
location = /dashboard.html {
root /usr/share/nginx/html;
}
location /swagger-ui {
root /usr/share/nginx/html;
}
}
#example
upstream {
upstream dns {
zone dns_zone 64k;
state /var/lib/nginx/state/stream_upstream_dns.conf;
}
}
cat /var/lib/nginx/state/stream_upstream_dns.conf
server 172.16.10.203:53 max_conns=100 fail timeout=15s slow start=5s;
#HTTPS 典型配置实例
server {
listen 80 default_server;
server_name www.example.com;
##强制HTTP流量重定向到HTTPS,满足安全标准
return 301 https://$server_name$request_uri;
}
server {
listen 443 default_server;
server_name www.example.com;
##配置证书和密钥完成最基础的SSL加解密过程
##使用openssl进行所有的SSL处理
ssl_certificate cert.crt;
ssl_certificate_key cert.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers aRSA:!ECDHE:!EDH:!KDHE;
ssl_prefer_server_ceiphers on;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
#HTTPS 典型配置实例
server {
listen 80 default_server;
server_name www.example.com;
##强制HTTP流量重定向到HTTPS,满足安全标准
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
##配置证书和密钥完成最基础的SSL加解密过程
##使用openssl进行所有的SSL处理
ssl_certificate cert.crt;
ssl_certificate_key cert.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers aRSA:!ECDHE:!EDH:!KDHE;
ssl_prefer_server_ceiphers on;
location / {
##在反向代理场景中,nginx与客户端直接采用加密HTTPS,服务器测采用HTTP传输
proxy_pass http://backend;
}
}
server {
listen 443 default_server;
server_name www.example1.com;
ssl_certificate cert1.crt;
ssl_certificate_key cert1.key;
}
server {
listen 443 default_server;
server_name www.example2.com;
ssl_certificate cert2.crt;
ssl_certificate_key cert2.key;
}
server {
listen 443 ssl;
ssl_certificate /etc/ssl/$ssl_server_name.crt;
ssl_certificate_key /etc/ssl/$ssl_server_name.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ceiphers on;
location / {
proxy_set_header Host $host;
proxy_pass http://backend;
}
}
server {
listen 443 ssl default_server;
ssl_certificate cert.crt;
ssl_certificate_key cert.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
}
server {
listen 443 ssl default_server;
ssl_certificate cert.crt;
ssl_certificate_key cert.key;
ssl_session_tickets on;
ssl_session_ticket_key ticket_file ;
}
$ nginx -s stop
$ ./config --with-openssl=/usr/local/src/openssl-1.1.1d
$ make && make install
Let’s encrypt
#一、安装Let's Encrypt
add-apt-repository paa:certbot/certbot
apt-get update
apt-get install python-certbot-nginx
#二、NGINX准备
server {
listen 80 default_server;
listen [::] default_server;
root /var/www/html;
server_name example.com www.example.com;
}
#三、获取证书并自动更新NGINX配置
sudo cerbot --nginx -d example.com -d www.example.com
#四、通过屏幕交互内容进行HTTPS配置,完成自动化证书签发和NGINX配置上线