by 老高
老高的技术博客 / 2017-10-18 19:42
nginx的一些配置记录
全局变量
$args //请求中的的参数名,即“?”后面的arg_name=arg_value形式的arg_name $arg_PARAMETER //这是参数的一个匹配模式,PARAMETER为具体的参数名,$arg_PARAMETER就表示获取具体的参数值,例如上面的$arg_name就是获取url中name的值 $is_args //判断url是否带参数,如果带,则返回一个?,否则返回一个空字符串 $http_user_agent //获取的是客户端访问代理的类型,请求头中的信息 $sent_http_content_type //获取的是http响应头中content_type的值 $sent_http_content_length //获取的是http响应头重的content_length的值 $request_filename //该变量获取的是请求的文件在linux服务器上的完整的绝对路径 $request_method //该表示获取的是http请求的方法 $request_uri //该变量表示的原始请求的uri,包括参数。所谓原始请求就是即使在内部做了重定向之后也不会变化 $uri //获取的是当前请求的uri,不包括参数 $content_length //获取的是http请求头中Content-Length的值 $content_type //获取的是http请求头中的Content-Type字段,不过这里也没显示。。。 $document_root //获取的是请求url的文件所在的目录路径 $document_uri //当前请求的uri,从上面的信息来看,和uri的效果是一样的 $remote_addr //获取的是客户端的ip地址,这里为什么是10.0.10.11呢,因为我是在本机上用curl测试的,即使客户端也是服务器 $remote_port //获取客户端的访问端口,这个端口是随机的 $remote_user //获取客户端的认证用户信息,这里因为没有用认证,所谓显示为空 $server_protocol //表示服务器端想客户端发送响应的协议 $server_addr //服务器的地址 $server_name //客户端访问服务端的域名,即url中的域名 $server_port //服务器端做出响应的端口号 $binary_remote_addr //显示二进制的客户端地址 $host //和server_name一样,表示的是域名 $hostname //表示服务器端的主机名 $proxy_add_x_forwarded_for //获取的是客户端的真实ip地址 $proxy_host //该变量获取的是upstream的上游代理名称,例如upstream backend $proxy_port //该变量表示的是要代理到的端口 $proxy_protocol_addr //代理头部中客户端的ip地址,或者是一个空的字符串 $upstream_addr //代理到上游的服务器地址信息 $upstream_cache_status //proxy的缓存状态,例如这里第一次访问为MISS,第二次访问时为HIT $upstream_response_length //上游服务器响应报文的长度 $upstream_response_time //上游服务器响应的时间 $upstream_status //上游服务器响应的状态码 $scheme //表示的是使用http的访问协议 http or https $limit_rate //表示当前连接的限速是多少,0表示无限制 $query_string //表示的是查询字符串,也就是url中的参数,和$args一样 $realpath_root //表示的是请求页面的真实所在目录的路径 和$document_root是一样的
http
老高在默认的nginx主配置中加入了时区,目的是输出日志时区默认为东八区。
同时加入了空主机头,防止直接用IP访问网站。
user nginx; worker_processes 1; # timezone env TZ=Asia/Shanghai; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; server { listen 80 default; return 500; } }
server
server { listen 8080; server_name laogao.com; root /tmp; index index.php index.html index.htm; location / { autoindex on; autoindex_localtime on; } }
缓存
伪静态
PHP
server { listen 80; server_name foo.com; root /path; index index.html index.htm index.php; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ .php$ { try_files $uri =404; include fastcgi.conf; fastcgi_pass 127.0.0.1:9000; } }
location
匹配规则
server { listen 8080; server_name laogao.com; root /tmp; index index.php index.html index.htm; # /匹配所有请求,所以其他请求如果都不匹配,就会匹配到这里 # PHP常用 location / { return 200 "/"; } # 严格匹配,不区分大小写,如果匹配到此块,立即处理请求 # 此处只匹配 /laogao ,加上一个"/"都算不一样 # curl -v laogao.com:8080/ location = /laogao { return 200 "/laogao"; } # 区分大小写匹配,匹配后继续搜索,直到没有匹配为止 # 如果有相同的区块,则谁先出现最后匹配到谁 location ~ /NIhao { return 200 "NIhao"; } # 叹号表示不匹配 location !~ /NIhao { return 200 "NIhao"; } # 不区分大小写匹配,匹配后继续搜索,直到没有匹配为止 # 如果有相同的区块,则谁先出现最后匹配到谁 # 以下代码匹配图片请求 location ~* .(jpe?g|png|gif|bmp)$ { valid_referers none blocked *.phpgao.com server_names ~.google. ~.baidu.; if ($invalid_referer) { return 403 'hehe'; } } # 普通匹配,匹配到后停止搜索,很适合做访问控制 # 此处匹配 http://laogao.com:8080/images/ # 此处不匹配 http://laogao.com:8080/images location ^~ /images/ { return 200 "images"; } }
匹配顺序
- Directives with the “=” prefix that match the query exactly. If found, searching stops.
- All remaining directives with conventional strings. If this match used the “^~” prefix, searching stops.
- Regular expressions, in the order they are defined in the configuration file.
-
If #3 yielded a match, that result is used. Otherwise, the match from #2 is used.
-
=
如果直接匹配,搜索停止,匹配请求。 - 剩下的区块的常规字符串,最长的匹配,如果遇到
^~
,搜索停止,匹配请求。 - 剩下的正则匹配区块按出现顺序匹配。
- 如果在剩下的区块中出现一个匹配,处理请求,如果都没有匹配,就用第二条的匹配。
防爬
防盗链
防爬虫
可以将下面的代码保存在/etc/nginx/agent_deny.conf
,然后在server段中加入include agent_deny.conf;
即可完成使命。
if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) { return 403; } #禁止指定UA及UA为空的访问 if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|^$" ) { return 403; } #禁止非GET|HEAD|POST方式的抓取 if ($request_method !~ ^(GET|HEAD|POST)$) { return 403; }
防盗链
匹配图片请求,然后判断referer,如果为空,phpgao.com域名,Google或百度爬虫,则放行,否则return 403。如果强硬一点,none可以去掉。
location ~* .(gif|jpe?g|png|swf|flv|rar|zip|bmp|mp3|swf)$ { valid_referers none blocked *.phpgao.com server_names ~.google. ~.baidu.; if ($invalid_referer) { return 403 'hehe'; } }
列出目录
location / { autoindex on; autoindex_localtime on; } location / { autoindex on; autoindex_localtime on; # 相当于创建了一个软连接 alias /home/wwwroot/xxx; }
跳转
# 80端口重定向到443 server{ listen 80; server_name blog.phpgao.com; rewrite ^(.*)$ https://$host$1 permanent; } # www指向blog server{ listen 80; server_name www.phpgao.com phpgao.com; return 301 https://blog.phpgao.com$request_uri; }
SSL
Let’s encryption
防注入
日志
goaccess phpgao.access.log -da --log-format=COMBINED > 1.html
参考
—
Shared via Inoreader