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

Windows nginx 添加echo模块_Nginx


把这个key文件变成证书请求文件

openssl req -new -key jesonc.key -out jesonc.csr

然后需要输入一些信息,最后生成文件

Windows nginx 添加echo模块_Nginx_02


可以把这两个文件交给权威机构进行签名,如果是个人的话可以自己签名

如果不指定日期的话默认是一个月就会失效,需要输入最开始设置的密码

openssl x509 -req -days 3650 -in jesonc.csr -signkey jesonc.key -out jesonc.crt

Windows nginx 添加echo模块_nginx_03

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代码执行