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调用 |
后缀 | 表示的含义 |
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然后需要输入一些信息,最后生成文件

可以把这两个文件交给权威机构进行签名,如果是个人的话可以自己签名
如果不指定日期的话默认是一个月就会失效,需要输入最开始设置的密码
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-toolsab -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代码执行
















