rewrite规则
实现url重写以及重定向
Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if
正则表达式
符号 | 表示意义 |
. | 匹配除换行符以外的任意字符 |
? | 重复0次或者1次 |
+ | 重复1次或者更多次 |
* | 最少链接数,那个机器连接数少就分发 |
\d | 匹配数字 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
[c] | 匹配单个字符c |
[a-z] | 匹配a-z小写字母的任意一个 |
\ | 转义字符 |
() | 用于匹配括号之间的内容,通过$1,$2调用 |
更多:http://tool.oschina.net/uploads/apidocs/jquery/regexp.html
https://zhidao.baidu.com/question/1732442184451227507.html
后缀 | 表示的含义 |
last | 停止这一轮的rewrite检测,然后查找匹配改变后URI的新location |
break | 停止rewrite检测 |
redirect | 返回302临时重定向,客户端会再次请求服务器 |
permanent | 返回301永久重定向,客户端会永久保存该重定向 ,不会请求服务器 |
geoip_module模块
基于IP地址匹配MaxMind GeoIP二进制文件,读取IP所在地域信息。
需要安装此模块
yum install nginx-module-geoip
使用场景:
- 区别国内外作HTTP访问规则
- 区别国外城市地域作HTTP访问规则
在nginx.conf头部引入改模块
load_module "modules/ngx_http_geoip_module.so"; load_module "modules/ngx_stream_geoip_module.so";
在MaxMind上下载地域文件:https://www.maxmind.com/en/home
下载GeoIP.dat.gz和GeoLiteCity.dat.gz一个是国家的ip库,一个是城市的ip库
在con.d配置一个conf
#使用 geoip_country /etc/nginx/geoip/GeoIP.dat; geoip_city /etc/nginx/geoip/GeoLiteCity.dat; server { listen 80; server_name localhost bushro.club; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { if($geoip_country_code !=CN){ return 403; } root /usr/share/nginx/html; index index.html index.htm; } location /myip { default_type text/plain; return 200 "$remote_addr $geoip_country_name $geoip_country_code $geoip_city"; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
访问myip接口就可以得到该地址的国家,城市信息。
实现对不同地区的访问控制。
HTTPS
为什么需要https?
HTTP协议由于是明文传送,所以存在三大风险:
- 被窃听的风险:第三方可以截获并查看你的内容
- 被篡改的危险:第三方可以截获并修改你的内容
- 被冒充的风险:第三方可以伪装成通信方与你通信
https协议
- 对传输内容进行加密以及身份验证
https证书
生成秘钥和CA证书步骤:
步骤1、生成key秘钥
步骤2、生成证书签名请求文件(csr文件)
步骤3、生成证书签名文件(CA文件)
安装openssl
yum install -y openssl
需要有ssl模块nginx -V
可以查看
--with-http_ssl_module
在nginx目录下创建ssl_key目录并执行,会让你输入两次自己定义的密码,需要记住,后面会使用到
文件名称可以随意
openssl genrsa -idea -out jesonc.key 1024
把这个key文件变成证书请求文件
openssl req -new -key jesonc.key -out jesonc.csr • 1
然后需要输入一些信息,最后生成文件
可以把这两个文件交给权威机构进行签名,如果是个人的话可以自己签名
如果不指定日期的话默认是一个月就会失效,需要输入最开始设置的密码
openssl x509 -req -days 3650 -in jesonc.csr -signkey jesonc.key -out jesonc.crt
Nginx配置https
server { listen 443; server_name 192.168.254.130 bushro.home; ssl_certificate /etc/nginx/ssl_key/jesonc.crt; ssl_certificate_key /etc/nginx/ssl_key/jesonc.key; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
Https服务优化
- 激活keepaliva长连接
- 设置ssl session缓存
keepalive_timeout 100; ssl_on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
Nginx常见问题
相同server_name多个虚拟主机优先级访问
最后读取到那个配置就按照那个配置的规则。
Nginx的alias和root区别
location /request_path/image/{ root /local_path/image/; } location /request_path/image/{ alias /local_path/image/; }
例如访问的地址为:http://www.baidu.com/request_path/image/1.png
root配置实际访问的是:/local_path/image/request_path/image/1.png
alias配置访问的是:/local_path/image/1.png
传递用户的真实IP地址
在多级代理的时候与第一级代理约定一个头,把真实的用户ip放进去,之后的代理依次传递,最后后端就可以获取到真实的ip地址。
常见错误
- 413
用户上传文件限制
client_max_body_size - 502
后端服务无响应
ab接口压力测试工具
yum install -y httpd-tools
ab -n 2000 -c 2 http://127.0.0.1/
-n 总的请求数
-c 并发数
-k 是否开启长连接
Nginx性能优化
- 文件句柄
Linux\Unix一切皆文件,文件句柄就是一个索引
默认是1024个文件句柄
全局修改
vim /etc/security/limits.conf
末尾添加
root soft nofile 10000 root hard nofile 10000
上传文件漏洞
在上传图片(1.jpg)中植入php代码,然后访问XXX/1.jpg/1.php
Nginx将1.jpg作为php代码执行