概述
给nginx添加登陆密码:
1、增加密码
htpasswd -bc /usr/local/nginx/conf/htpasswd.user username password
htpasswd -b /usr/local/nginx/conf/htpasswd.user username1 password1 # 增加第二个用户把'-c'去掉,不然会覆盖掉前面的用户
2、修改文件/usr/local/ngnix/conf/htpasswd.users的所有者所属组,与nginx的所属用户一致
3、配置文件中加上两行
auth_basic "Restricted Access";
auth_basic_user_file /usr/local/nginx/conf/htpasswd.users;
热升级nginx:(只会改变nginx二进制文件)
1、备份现有的nginx二进制文件
cp /url/local/openresty/nginx/sbin/nginx /url/local/openresty/nginx/sbin/nginx.old
2、将新的二进制文件覆盖原来的nginx二进制文件
cp -f nginx /url/local/openresty/nginx/sbin/nginx
3、给原nginx的master进程发送一个热部署的信号,此时新老进程一起运行,老进程不再监听history |grep patch端口
kill -USR2 13195(进程号)
4、关闭老进程,进程号还在,进程没了
kill -WINCH 13195
5、回滚:向老master发送HUP,向新master发送QUIT
6、关闭老进程
kill -QUIT 13195
日志切割:
先备份日志,再执行:nginx -s reopen,重新生产日志文件(或:kill -USER1 $(cat /usr/local/openresty/nginx/logs/nginx.pid))
goaccess分析access log
制作https站点:
1、安装python2-certbot-nginx
yum install python2-certbot-nginx
2、制作
certbot --nginx --nginx-server-root=/usr/local/openresty/nginx/conf -d geektime.taohui.pub
Nginx进程管理:信号
Master进程:
1、监控worker进程:CHLD
2、管理worker进程
3、接收信号
TERM,INT
OUIT
HUP
USER1
USER2
WINCH
Worker进程:
接收信号:
TERM,INT、QUIT、USR1、WINCH
nginx命令行:
reload:HUP
reopen:USER1
stop:TERM # 立即退出nginx
quit:QUIT # 优雅的关闭nginx(主要针对http,设置定时器(worker_shutdown_timeout)、关闭监听句柄、关闭空闲连接、在循环中等待全部连接关闭、退出进程)
模块分类:
核心模块:NGX_CORE_MODULE
子模块: NGX_EVENT_MODULE:
event_core:通用参数模块
epoll
NGX_HTTP_MODULE:
ngx_http_core_module:通用参数模块
请求处理模块
响应过滤模块
upsteam相关模块
NGX_STREAM_MODULE:
ngx_stream_core_module:通用参数模块
steam模块
NGX_MAIL_MODULE:
ngx_mail_core_module
NGX_CONF_MODULE:
ngx_conf_module
动态模块:
1、Configure加入动态模块
例: --with-http_image_filter_module=dynamic
2、编译进binary
3、启动时初始化模块数组
4、读取load_moudule配置
linux下动态库以.so结尾,静态库以.c结尾
5、打开动态库并加入模块数组
在配置文件里导入动态库路径:
load_module modules/ngx_http_image_filter_module.so
在location定位的路径上设置读取图片大小:image_filter resize 15 10
6、基于模块数组开始初始化
http模块:
Listen:server配置块下
listen address[:port]
listen port
listen unix:path # unix socket地址,只能用于本机通讯
例子:
listen unix:/var/run/nginx.sock;
listen 127.0.0.1:8000;
listen 127.0.0.1; # 默认使用80端口
listen 8000;
listen *:8000;
listen localhost:8000 bind;
listen [::]:8000 ipv6only=on; #ipv6地址配置,只支持ipv6
listen [::1];
处理HTTP请求头部的流程:
server_name:
1、指令后可以跟多个域名,第一个是主域名
server_name first.taohui.com second.taohui.com;
server_name_in_redirect on; # 可以放在http、server、location中,默认是off,当设置为on时,访问第二个域名,会通过第一个域名指向服务
return 302 /redirect;
2、*泛域名:仅支持在最前或最后加*
server_name *.taohui.tech
3、正则表达式:加~前缀
server_name www.tail.com ~^wwwd++.taohui.tech$;
4、用正则表达式创建变量:用()
server {
server_name ~^(www.)?(.+)$;
location / { root /sites/$2; } # $2取server_name中第二个括号内匹配的值
}
server {
server_name ~^(www.)?(?<domain>.+)$;
location / { /root/sites/$domain; } # 取(?<domain>.+)匹配的值
}
5、其他:
.taohui.tech可以匹配taohui.tech *.taohui.tech
_匹配所有
""匹配没有传递Host头部
6、server匹配顺序
01 精确匹配
02 *在前的泛域名
03 *在后的泛域名
04 按文件中的顺序匹配正则表达式域名
05 default server
- 第一个
- listen指定default
http请求处理的11个阶段
POST_READ realip
SERVER_REWRITE rewrite
FIND_CONFIG
REWRITE rewrite
POST_REWRITE
PREACCESS limit_conn,limit_req
ACCESS auth_basic,access,auth_request
POST_ACCESS
PRECONTENT try_files
CONTENT index,autoindex,concat
LOG access_log
postread阶段:获取真实客户端地址的realip模块
用户(内网ip:192.168.0.56)->ADSL(运营商公网IP:115.204.33.1)->CDN(IP地址:1.1.1.1)->某反向代理(IP地址:2.2.2.2)->Nginx
TCP连接的四元组(src ip,src port,dst ip,dst port)
HTTP头部X-Forwarded-For用于传递IP
HTTP头部X-Real-IP用于传递用户IP:
X-Forwarded-For: 115.204.33.1, 1.1.1.1
X-Real-IP: 115.204.33.1
真实用户IP使用方式:基于变量
将X-Forwarded-For等的值覆盖binary_remote_addr、remote_addr,这样做限制(limit_conn)才有意义
realip模块:
编译进Nginx: --with-http_realip_module
功能: 修改客户端地址
变量: realip_remote_addr、realip_remote_port
指令: set_real_ip_from、real_ip_header、real_ip_recursive
rewrite阶段的rewrite模块:
return指令
可以放在server、location、if中
rewrite指令:
重写URL:
rewrite regex replacement[flag];
- 将regex指定的url替换成replacement这个新的url
- 可以使用正则表达式及变量提取
- 当replacement以http://或者https://或者$schema开头,则直接返回302重定向
- 替换后的url根据flag指定的方式进行处理
- last:用replacement这个URI进行新的location匹配
- break:break指令停止当前脚本指令的执行,等价于独立的break指令
- redirect:返回302重定向,临时重定向
- permanent:返回301重定向,永久重定向
例:
location /first {
rewrite /first(.*) /second$1 last;
return 200 'first';
}
location /second {
rewrite /second(.*) /third$1 break;
return 200 'second!';
}
location /third {
return 200 'third!'
}
if指令:
Syntax:if(condition){...}
Context:server,location
注意:检查是否为空或者值为0;与字符串匹配,=或!=;将变量与正则表达式做匹配(大小写敏感:~或者!~,大小写不敏感:~*或者!~*)
检查文件是否存在(-f或!-f);检查目录是否存在(-d或!-d);检查文件、目录、软连接是否存在(-e、!-e)
检查是否为可执行文件(-x、!-x)
find_config阶段:找到请求的location指令块
merge_slashes on|off; #合并url中的斜杠
location匹配规则:
前缀字符串:
- 常规
- =:精确匹配
- ^~:匹配上后则不再进行正则表达式匹配,即禁止正则表达式匹配
正则表达式:
- ~:大小写敏感
- ~*:忽略大小写
合并连续的/符号:
- merge_slashes on
用于内部跳转的命名location
- @
优先级:精确匹配(=)>禁止正则表达式匹配(^~)>正则表达式匹配>常规前缀字符串匹配(匹配越长优先级越高)
preaccess阶段:
对连接做限制的limit_conn模块:
- 生效阶段:NGX_HTTP_PREACCESS_PHASE阶段
- 模块:http_limit_conn_module
- 默认编译进nginx,通过--without-http_limit_conn_module禁用
- 生效范围:
-全部worker进程(基于共享内存)
-进入preaccess阶段前不生效
-限制的有效性取决于key的设计:依赖postread阶段的realip模块取到真实ip
- 定义共享内存(包括大小),以及key关键字
Syntax: limit_conn_zone key zone=name:size;
Context: http
- 限制并发连接数:
Syntax: limit_conn zone number;
Context: http,server,location
- 限制发生时的日志级别
Syntax: limit_conn_log_level info |notice |warn| error;
default: limit_conn_log_level error;
Context: http,server,location
- 限制发生时向客户端返回的错误码
Syntax: limit_conn_status code;
Default: limit_conn_status 503;
Context: http,server,location
- limit_rate 50; # 限制向用户返回的速度
对请求做限制的limit_req模块:
- 生效阶段:NGX_HTTP_PREACCESS_PHASE阶段
- 模块:http_limit_req_module
- 默认编译进nginx,通过--without-http_limit_req_module禁用
- 生效算法:leaky bucket算法
- 生效范围:
-全部worker进程(基于共享内存)
-进入preaccess阶段前不生效
- 定义共享内存(包括大小),以及key关键字
Syntax: limit_req_zone key zone=name:size rate=rate;
Context: http
- 限制并发连接数:
Syntax: limit_req zone=name [burst=number][nodelay];
Context: http,server,location
-burst默认为0
-nodelay,对burst中的请求不再采用延时处理的做法,而是立刻处理
access阶段:
对ip做限制的access模块
- 生效阶段:NGX_HTTP_ASSCESS_PHASE阶段
- 模块:http_access_module
- 默认编译进nginx,通过--without-http_access_module禁用
- 生效范围:
进入access阶段前不生效
Syntax: allow或deny address|CIDR|unix:|all;
Context: http,server,location,limit_except
事例:
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
对用户名密码做限制的auth_basic模块:
基于HTTP Basic Authutication协议进行用户名密码的认证
默认编译进nginx:
通过--without-http_auth_basic_module禁用功能
语法:
auth_basic string|off; # 开启的话,string就是给浏览器中显示的title
auth_basic_user_file file; # file中配置用户名密码
Context: http,server,location,limit_except
生成密码文件:
工具:httpd-tools
命令:htpasswd -c file -b user pass
使用第三方做权限控制的auth_request模块:
功能:向上游的服务转发请求,若上游昙厵返回的响应码是2xx,则继续执行,若上游服务返回的是401或者403
,则将响应返回给客户端
编译:--with-http_auth_request_module
指令:
auth_request uri|off;
auth_request_set $variable value;
Context:http,server,location
示例:
location / {
auth_request /test_auth;
}
location = /test_auth{
proxy_pass http://127.0.0.1:8080/auth_upstream;
}
location /auth_upstream{
return 403 'auth success'
}
satisfy指令:允许改变access执行顺序
access模块执行顺序:access模块、auth_basic模块、auth_request模块、其他模块
指令:
Syntax:satisfy all|any; # all必须所有access模块通过才放行,any任一个模块通过请求即可
Default: satisfy all;
Context: http,server,location
注意:
如果return和access放在一起,access模块不会生效
precontent阶段:
按序访问资源的try_files模块:
模块:ngx_http_try_files_module模块
指令:
Syntax:
try_files file ... uri;
try_files file ... =code;
Context: server,location
功能:依次试图访问多个url对应的文件(由root或者alias指令指定),当文件存在时直接返回文件内容,如果所有
文件都不存在,咋按最后一个URL结果或code返回;
mirror模块:实时拷贝流量
模块:ngx_http_mirror_module模块
功能:处理请求时,生成子请求访问其他服务,对子请求的返回值
指令:
Syntax: mirror uri|off; # 将请求指向指向另一个url
Default: mirror off;
Context: http,server,location
Syntax: mirror_request_body on|off;
Default: mirror_request_body on;
Context: http,server,location
content阶段:
static模块:
root和alias指令:将url映射为文件路径,以返回静态文件内容
Syntax: alias path;
Context: location
Syntax: root path;
Default: root html;
Context: http,server,location,if in location
差别:
root会将完整url映射进文件路径中,即会将location后的匹配路径加到路径之后
alias只会将location后的URL映射到文件路径
static模块的3个变量:
request_filename:待访问的完整路径
document_root:由URI和root/alias规则生产的文件夹路径,文件夹可能是软链接
realpath_root:将document_root中的软链接等换成真实路径
静态文件返回时的content-type:
Syntax: types {...}
Default: types { text/html; image/gif gif; image/jpeg jpg; }
Syntax: default_type mime-type;
Context: default_type text/plain;
Syntax: types_hash_bucket_size size;
Default: types_hash_bucket_size 64;
Syntax: types_hash_max_size size;
Default: types_hash_max_size 1024;
Syntax:log_not_found on|off;
Default: log_not_found on;
Context: http,server,location
static模块对url不以斜杠结尾却访问目录的做法:
server_name_in_redirect off; # 重定向时on以主域名返回给客户端url,off是以访问的域名返回url;
port_in_redirect on; # on访问的端口也显示在返回重定向的域名中
absolute_redirect on; # 重定向时on的时候返回的url是绝对路径,带域名,否则返回只路径不带域名
Context:http,server,location
index模块(ngx_http_index_module:无法移除)和autoindex模块(去除:--without-http_autoindex_module):
index模块:访问url末尾有/时,默认寻找目录下指定的文件,优先级高于autoindex
Syntax: index file ...;
Default: index index.html;
Context: http,server,location
autoindex模块:访问url末尾有/时,尝试以html/xml/json/jsonp等格式返回root/alias中指向目录的目录结构
autoindex on |off; # 默认off,不开启autoindex
autoindex_exact_size on|off; # 默认on,绝对路径,以字节为单位显示,格式为相对路径(off)时会根据文件大小改变单位,格式为html时生效
autoindex_format html|xml|json|jsonp; # 显示格式,默认html
autoindex_localtime on|off; # 默认off,是否以本地时间格式显示
Context:http,server,location
提升多个小文件性能的concat模块:
功能:当页面需要返回多个小文件是,把他们的内容合并到一次http响应中返回,提升性能
url格式:??后是要访问的文件,文件之间以逗号分割
模块:ngx_http_concat_module
模块开发者Tengine,先将这个模块下载下来,然后编译时加上--add-module=../nginx-http-concat/
指令:
concat on|off; # 默认off
concat_types:MIME types; # 对哪些类型的内容合并,默认:text/css application/x-javascript
concat_unique on|off; # 默认on,对多种类型文件合并
concat_max_files numberp; # 最多合并多少文件,默认10个
concat_delimiter string; # 定义返回文件内容之间的分隔符,默认NONE
concat_ignore_file_error on|off; # 默认off,忽略合并的文件有错误的情况,比如403或404
Context:http,server,location
access日志,log(ngx_http_log_module):
指令:
Syntax: log_format name [escape=default|json|none] string ...;
Default: log_format combined "...";
Context: http
Syntax: access_log path[format [buffer=size][gzip[=level][flush=time][if=condition]]]
access_log off;
Default: access_log logs/access.log combined;
Context: http,server,location,if in location,limit_except
# 对日志文件名包含变量使的优化(缓存,如果不使用缓存,每次写入日志文件都要重新打开文件)
Syntax: open_log_file_cache max=N(缓存内的最大文件句柄数) [inactive=time(文件访问完后在这段时间内不会被关闭,默认10s)][min_uses=N][valid=time(超出valid时间后,将对缓存的日志检查是否存在,默认60s)]
open_log_file_cache off;
Default: open_log_file_cache off;
Context: http,server,location
http过滤模块:会改变发往用户的响应
copy_filter:复制包体内容
postpine_filter:处理子请求
header_filter:构造响应头部
write_filter:发送响应
sub模块:将响应中指定的字符串替换成新的字符串
模块:ngx_http_filter_module(--with-http_sub_filter_module)
指令:
sub_filter string replacement; # 将匹配string变为replacement,忽略大小写
sub_filter_last_modified on|off; # 是否返回原来的内容,默认off
sub_filter_once on|off; # 默认on,只替换一次,off的话,替换全局
sub_filter_types mome_types ...; # 只针对指定类型进行替换,默认text/html
Context:http,server,location
addition模块:在响应前或响应后增加内容,而增加内容的方式是通过新增子请求的响应完成
模块:ngx_http_addition_filter_module(--with-http_addition_module)
指令:
add_before_body url; # 将访问url的子请求响应加到响应后
add_after_body url;
addition_types mime-type ...; # 只针对指定类型,默认text/html
Context:http,server,location
Nginx变量:
存放变量的哈希表:
variables_hash_bucket_size 64;
variables_hash_max_size 1024;
Context:http
HTTP框架提供的请求相关的变量:
1、HTTP请求相关的变量
arg_参数名:URL中摸个具体参数的值
query_string:与args变量完全相同
args:全部URL变量
is_args:如果请求URL中有参数则返回?否则返回空
content_length:HTTP请求中标识包体长度Content-Length头部的值
content_type:标识请求包体类型的Content-Type头部的值
uri:请求的URI(不同URL,不包括?后的参数)
document_uri:与uri完全相同
scheme:协议名,例如HTTP或者HTTPS
request_method:请求方法,例如GET或者POST
request_length:所有请求内容的大小,包括请求行、头部、包体等
remote_user:有HTTP Basic Authutication协议传入的用户名
request_body_file:临时存放请求包体的文件
如果包体非常小则不会存文件
client_body_in_file_only:强制所有包体存入文件,且可决定是否删除
request_body:请求中的包体,这个变量当且仅当使用反向代理,切设定用内存暂存包体是才会有效
request:原始的url请求,含有方法与协议版本,例如GET /?腌&表2 HTTP/1.1
host: 1、向从请求行中获取
2、如果含有Host头部,则用其值替换掉请求行中的主机名
3、如果前两者都娶不到,则使用匹配上的server_name
http_头部名字:返回一个具体请求头部的值
特殊:
http_host
http_user_agent
http_referer
http_via
http_x_forwarded_for
http_cookie
2、TCP连接相关变量
binary_remote_addr:客户端地址的整形格式,对于IPv4是4字节,对于IPv6是16字节
connection:递增的连接序号
connection_requests:当前连接上的请求数,对keepalive连接有意义
remote_addr:客户端地址
remote_port:客户端端口
proxy_protocol_addr:若使用了proxy_protocol协议则返回协议中的地址,否则返回空
proxy_protocol_port:若使用了proxy_protocol协议则返回协议中的端口,否则返回空
server_addr:服务器端地址
server_port:服务器端端口
TCP_INFO:tcp内核层参数,包括$tcpinfo_rtt,$tcpinfo_rttvar,$tcpinfo_snd_cwnd,$tcpinfo_rcv_space
server_protocol:服务端协议,例如HTTP/1.1
3、Nginx处理请求产生变量
request_time:请求处理到现在的耗时,单位为秒,精确到毫秒
server_name:匹配上请求的server_name值
https:如果开启了TLS/SSL,则返回on,否则返回空
request_completion:若请求处理完则返回OK,否则返回空
request_id:以16进制输出的请求标识id,该id共含有16字节,是随机生成的
request_filename:待访问文件的完整路径
document_root:由URI和root/alias规则生成的文件夹路径
realpath_root:将document_root中的软连接等换成真实路径
limit_rate:返回客户端响应是的速度上限,单位为每秒字节数。可以通过set指令修改对请求产生效果
4、发送HTTP响应时的相关变量
body_bytes_sent:响应中body包体的长度
bytes_sent:全部响应的长度
status:http响应中的返回码
sent_trailer_名字:把响应结尾内容里值返回
5、Nginx系统变量
time_local:以本地时间标准输出的当期时间
time_iso8601:使用ISO 8601标准输出的当前时间
nginx_version:Nginx版本号
pid:所属worker进程的进程id
pipe:使用了管道则返回p,否则返回.
hostname:所在服务器的主机名
mscc:1970.1.1到现在的时间,单位秒
使用变量防盗链的referer模块:
场景:在网页上点击url时,跳转时http请求的头部会通过referer头部,将该网站当前的url带上
目的:拒绝非正常的网站访问我们站的资源
思路:通过referer模块,用invalid_referer变量(允许访问为空,不允许访问为1)根据配置判断referer头部是否合法
referer模块:默认编译进nginx,--without-http_referer_module
指令:
valid_referers none|blocked|server_names|string ...;
# 可携带多个参数,表示多个referer头部都生效;
# none:允许缺失referer头部的请求访问
# block:允许referer头部没有对应的值请求访问,反向代理时常见
# server_names:若referer中站点域名与server_name中本机域名某个匹配,则允许访问
# 匹配正则表达式
# 匹配域名前缀或后缀,可在后面或前面加*
referer_hash_bucket_size 64;
referer_hash_max_size 2048;
Context:server,locationFR
使用变量实现防盗链的secure_link模块:
过程:
- 由服务器(也可以是nginx)生成加密的安全链接url,返回给客户端
- 客户端使用安全url访问nginx,由nginx的secure_link变量判断是否验证通过
模块:ngx_http_secure_link_module,编译时--with-http_secure_link_module
变量:
secure_link # 值为空字符串:验证不通过,值为0:URL过期,值为1:验证通过
secure_link_expires # 时间戳的值
指令:
secure_link
secure_link_md5
secure_link_secret
事例:
命令行生成安全链接:
原请求:/test1.txt?md5=md5生成值&expires=时间戳
生成md5:echo -n '时间戳URL客户端IP 密钥'|openssl md5 -binary |openssl base64|tr +/ -|tr -d =
Nginx配置:
- secure_link $arg_md5,$args_expires; # 获取原请求
- secure_link_md5 "$secure_link_expires$uri$remote_addr secret"; # 验证md5的值
仅对URI进行哈希的简单办法:
- 将请求URI分为三个部分:(原请求:link,生成安全请求:/prefix/md5/link)
/prefix/hash/link
- Hash生成方式:(echo -n 'linksecret'|openssl md5 -hex)
对"link密钥"做md5哈希求值
- 用secure_link_secret secret;配置密钥,看该密钥是否与上一步hash生成密钥匹配
为复杂的业务生成新的变量:map模块
功能:基于已有模块,使用类似switch{case:... default:...}的语法创建新变量,为其他基于变量值实现功能的模块提供更多的变量
模块:ngx_http_map_module,--without-http_map_module
指令:
map string $variable {...} # 大括号内为case语句,string为用来匹配的变量,生成的值赋给variable
map_hash_bucket_size size;
map_hash_max_size 2048;
Context:http
例子:
map $http_host $name {
hostnames; # 使用hostnames指令,可以对域名前缀和后缀*泛域名匹配
default 0;
~map.taow+.org.cn 1;
*.taohui.org,cn 2;
map.taohui.tech 3;
map.taohui.* 4;
}
通过变量指定少量用户实现AB测试:split_client模块
功能:基于已有变量创建新变量,为其他AB测试提供更多的可能性
模块:ngx_http_split_clients_module,--without-http_split_clients_module
已有变量:
字符串
一个或多个变量
变量与字符串的组合
case规则:
xx.xx%:支持小数点后2位,所有项的百分比相加不能超过100%
*:由它匹配剩余的百分比
指令:
split_clients string $variable {...}
根据IP地址范围的匹配生成新变量:geo模块
模块:ngx_http_geo_module,默认编译进
功能:根据IP地址创建新变量
指令:geo [$address] $variable {...}
规则:指令后不输入$address,那么默认使用$remote_addr变量作为IP地址
{}内的指令匹配:优先最长匹配
- ip地址掩码
- default
- 通过proxy指令指定可信地址(参考realip模块),此时remote_addr的值为X-Forwarded-For头部值中最后一个IP
- prxoy_recursive允许循环地址搜索
- include
- delete删除指定网络
例子:
geo $country {
default ZZ;
# include conf/gep.conf;
proxy 116.15.160.193;
127.0.0.1/24 US;
}
使用变量获取用户的地理位置:geoip模块(基于MaxMind数据库从客户端获取变量)
功能:根据IP地址创建新变量
模块:ngx_http_geoip_module,默认未编译进,--with-http_geoip_module
流程:
- 安装MaxMind里的geoip的C开发库
- 编译Nginx时,带上--with-http_geoip_module
- 下载MaxMind中的二进制地址库
- 使用geoip_country或者geoip_city指令配置好nginx.conf
- 运行(或者生级nginx)
指令:
geoip_country file; # 指定国家类的文件
geoip_proxy address|CIDR; # 定义可信地址。 如果请求来自可信地址,nginx将使用其“X-Forwarded-For”头来获得地址
geoip_city file; # 指定城市类的文件
geoip_proxy_recursive on|off; #如果关闭递归查找,在客户端地址与某个可信地址匹配时,nginx将使用“X-Forwarded-For”中的最后一个地址来代替原始客户端地址。 如果开启递归查找,在客户端地址与某个可信地址匹配时,nginx将使用“X-Forwarded-For”中最后一个与所有可信地址都不匹配的地址来代替原始客户端地址
Context:http
变量:
- $geoip_country_code
两个字母的国家代码,比如CN或者US
- $geoip_country_code3
三个字符的国家代码,比如CHN或者USA
- $geoip_country_name
国家名称,例如"China"
对客户端使用keepalive提升连接效率:
协议:
Connection头部:close|keepalive
Keep-Alive: 值为timeout=n,单位为秒,表示至少保留n秒
指令:
keepalive_diable none|brower ...; # 默认msie6,不使用keepalive
keepalive_requests number; # 一个keepalive连接最多执行多少条指令,默认100条
keepalive_timeout timeout [header_timeout]; # 空闲多少秒关闭(默认75s)【一个keepalive至少保留多少秒】
日常问题:
ngnix添加有的模块编译失败,打补丁:下载对应版本补丁后
sudo patch -p1 < /software/write_filter-1.7.11.patch
nginx使用nginx_upstream_check_module-master监控upstream模块
1、下载模块(版本对应)
2、进入nginx的目录打补丁:patch -p1 < ../nginx_upstream_check_module-master/check_1.16.1+.patch
3、编译、make、替换nginx,nginx升级
patch -p0 < /usr/local/nginx-upstream-jvm-route-master/jvm_route.patch
nginx返回的包头,Content-encoding 是gzip,实际却没有被压缩,注意配置gzip_min_length、gzip_types
nginx转发问题:
加上/,不会带后缀转发,带/会带后缀转发
proxy_pass http://js.test.com/;
if ( $uri !~* "^/ssologin/getToken$|^/services/WangWangTodoListService$|^/services/WangWangWorkflowService$|^/spa/workflow/static4mobile/index.html$|^/spa/workflow/static4mobileform/index.html$" ) {
rewrite ^(.*) http://i.want-want.com/$1 permanent;
}
请求头:
X-Frame-Options HTTP 响应头是微软提出来的一个HTTP响应头,主要用来给浏览器指示允许一个页面可否在 <frame>, <iframe> 或者 <object> 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去
# DENY:表示该页面不允许在frame中展示,即使在相同域名的页面中嵌套也不允许
# SAMEORIGIN:表示该页面可以在相同域名页面的frame中展示
# ALLOW-FROM url:表示该页面可以在指定来源的frame中展示
例子:add_header X-Frame-Options:SAMEORIGIN;
最后
以上就是敏感巨人为你收集整理的nginx学习笔记的全部内容,希望文章能够帮你解决nginx学习笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复