文章目录
nginx 核心配置示例
基于不同的IP、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块ngx_http_core_module实现。
1. 新建一个PC web站点
root@z2:~# mkdir /apps/nginx/conf/conf.d
root@z2:~# vim /apps/nginx/conf/conf.d/pc.conf
root@z2:~# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name www.mage.net;
location / {
root /data/nginx/html/pc;
}
}
root@z2:~# vim /apps/nginx/conf/nginx.conf
在http内添加 include /apps/nginx/conf/conf.d/*.conf;
root@z2:~# mkdir /data/nginx/html/pc -p
root@z2:~# echo "pc web" > /data/nginx/html/pc/index.html
root@z2:~# nginx -s reload
解析host
192.168.1.102 www.mage.net
测试
root@z2:~# curl www.mage.net
pc web
2. 新建一个Mobile web站点:
root@z2:~# cat /apps/nginx/conf/conf.d/mobile.conf
server {
listen 80;
server_name mobile.mage.net;
location / {
root /data/nginx/html/mobile;
}
}
root@z2:~# mkdir /data/nginx/html/mobile -p
root@z2:~# echo "mobile web" >> /data/nginx/html/mobile/index.html
3. root 与alias
root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location
alias :与apache 中的alias作用相似,类似别名,文件的绝对路径是 是alias
server {
listen 80;
server_name www.mage.net;
location / {
root /data/nginx/html/pc; }
location /about {
root /data/nginx/html/pc;
}
# location /about {
# alias /data/nginx/html/pc;
# }
}
在pc.conf 中添加 about 的访问路径。
当访问 www.mage.net/about/ 时候,
如果root的写法: 则实际访问的是 /data/nginx/html/pc/about/index.html;
如果alias的写法: 则实际访问的是 /data/nginx/html/pc/index.html;
4. location 的详细使用
在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是用户请求的 字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索, 并使用此location处理此请求。
语法规则: location [=|~|~*|^~] /uri/ { … }
= #用于标准uri前,需要请求字串与uri精确匹配,如果匹配成功就停止向下匹配并立即处理请求。
~ #用于标准uri前,表示包含正则表达式并且区分大小写
~* #用于标准uri前,表示包含正则表达式并且不区分大写
!~ #用于标准uri前,表示包含正则表达式并且区分大小写不匹配
!~* #用于标准uri前,表示包含正则表达式并且不区分大小写不匹配
^~ #用于标准uri前,表示包含正则表达式并且匹配以什么开头
$ #用于标准uri前,表示包含正则表达式并且匹配以什么结尾
\ #用于标准uri前,表示包含正则表达式并且转义字符。可以转. * ?等
* #用于标准uri前,表示包含正则表达式并且代表任意长度的任意字符
4.1 匹配案例-精确匹配
在server部分使用location配置一个web界面,要求:当访问nginx 服务器的/login的时候要显示指定html文件的内容
server {
listen 80;
server_name www.mage.net;
location / {
root /data/nginx/html/pc; }
location =/1.jpg {
root /var/www/nginx/images;
index index.html; }nginx
}
==注意:==location =/1.jpg 等于号与 “/”之间不能有空格
把/data/nginx/html/pc 与 /var/www/nginx/images目录下,都放置一个相同名称但内容不同的1.jpg 图片
当访问 www. mage.net/1.jpg 时,则看到的是/var/www/nginx/images的图片
4.2 匹配案例-区分大小写
如果uri中包含大写字母,组此条件不匹配
location ~ /A.?\.jpg {
index index.html;
root /var/www/nginx/images;
}
将只能访问以小写字符的AX.jpg图片,不能识别大写的 JPG结尾的图片(就是区分正则表达式后面接的固定部分,区分大小写)。
4.3 匹配案例-不区分大小写
#使用正则表达式
location ~* /A.?\.jpg {
index index.html;
root /var/www/nginx/images;
}
则可以访问 AX.jpg、AX.JPG 、 AX.Jpg、AX.jPg 诸如此类的图片
#不使用正则表达式
# location ~ /aa.jpg {
# index index.html;
# root /opt/nginx/html/image;
# }
location ~* /aa.jpg {
index index.html;
root /opt/nginx/html/image;
}
对于不区分大小写的location,则可以访问任意大小写结尾的图片文件,如区分大小写则只能访问aa.jpg,不区分大小写则可以访问aa.jpg以外的资源比如Aa.JPG、aA.jPG这样的混合名称文件
4.4 匹配案例-URI开始
location ^~ /images {
root /data/nginx;
index index.html;
}
# location /images1 {
# alias /data/nginx/html/pc;
# index index.html;
# }
root@z2:/data/nginx# echo "/data/nginx/images" >/data/nginx/images/index.html
root@z2:/data/nginx# echo "/data/nginx/images1" >/data/nginx/images1/index.html
没有开启注释前 ,没有使用URI开始的等级最高。实现效果是访问images和images1返回不同的结果
root@z2:~# curl www.mage.net/images/
/data/nginx/images
root@z2:~# curl www.mage.net/images1/
pc web (注意此时的结果并不是/data/nginx/images1)
开启注释后
root@z2:~# curl www.mage.net/images/
/data/nginx/images
root@z2:~# curl www.mage.net/images1/
/data/nginx/images1
4.5 匹配案例-文件名后缀
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {
root /data/img;
index index.html;
}
location ^~ /images {
root /data/nginx;
index index.html;
}
上传一个和/data/img/images1目录不一样内容的的图片1.jpg 到/data/nginx/images1
访问www.mage.net/images1/i.jpg 发现 访问是/data/img/images1 目录的图片
结论:以文件结尾的优先级大于以文件开头的优先级
4.6 location 的优先级
匹配优先级:=, ^~, ~或 ~* , 不带符号/
location优先级:(location =) > (location 完整路径) > (location ^~ 路径) > (location~,~* 正则顺序) > (location 部分起始路径) > 不带符号/
4.7 生产使用案例
直接匹配网站根会加速Nginx访问处理:
location = / {
......;
}
location / {
......;
}
静态资源配置:
location ^~ /static/ {
......;
}
# 或者
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
......;
}
多应用配置
location ~* /app1 {
......;
}
location ~* /app2 {
......;
}
5. nginx 的四层访问控制
访问控制基于模块ngx_http_access_module实现,可以通过匹配客户端源IP地址进行限制。
location /about {
alias /data/nginx/html/pc;
index index.html;
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all; #先允许小部分,再拒绝大部分
}
6. Nginx账户认证功能
做法和apache 一样,工具名也一样都是htpasswd 但是包名不一样
root@z2:~# apt install apache2-utils -y
htpasswd 常用命令
- -c 创建一个新文件
- -b 从命令行使用密码,而不是提示输入密码。
- -m 强制对密码进行MD5加密(默认)
root@z2:~# htpasswd -cbm /apps/nginx/conf/.htpasswd user1 123456
Adding password for user user1
root@z2:~# htpasswd -b /apps/nginx/conf/.htpasswd user2 123456
Adding password for user user2
配置文件
location = /login/ {
root /data/nginx/html/pc;
index index.html;
auth_basic "login password";
auth_basic_user_file /apps/nginx/conf/.htpasswd;
}
}
访问 www.mage.net/login/ 就要输入密码了
7.自定义错误页面
error_page 500 502 503 504 404 /error.html;
location = /error.html {
root html;
}
注:这里的html 仍然是相对目录,相对于安装nginx时prefix_path 目录,apt 安装的是/etc/nginx/html /。
然后在html 中创建error.html 即可。
8. 自定义访问日志
root@z2:~# mkdir /data/nginx/logs
nginx 的日志定义注意要和server_name 保持一次,便于后期维护
server_name www.mage.net;
access_log /data/nginx/logs/www-mage-net_access.log;
error_log /data/nginx/logs/www-mage-net_error.log;
9. 检测文件是否存在
try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文
件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前
的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。
$uri指的是请求的文件和路径,不包括“?”或者“#”之后的东西,$request_uri则是请求的整个字符串,包含了后面的query_string的。
location /about {
root /data/nginx/html/pc;
index index.html;
#try_files $uri /about/default.html; #访问的页面不存在,跳转到指定页面
#try_files $uri $uri/index.html $uri.html /about/default.html;
try_files $uri $uri/index.html $uri.html =489 ;
}
验证: 只设置 try_files $uri $uri/index.html $uri.html /about/default.html;时
root@z2:/data/nginx/html/pc/about# ls
default.html xx.html
root@z2:/data/nginx/html/pc/about# curl www.mage.net/about/xx
xx PAGE
root@z2:/data/nginx/html/pc/about# curl www.mage.net/about/xx/
default
只设置 try_files $uri $uri/index.html $uri.html =489 ;时
root@z2:/data/nginx/html/pc/about# curl www.mage.net/about/xx
xx PAGE
root@z2:/data/nginx/html/pc/about# curl www.mage.net/about/xx/
root@z2:/data/nginx/html/pc/about# curl -I www.mage.net/about/xx/
HTTP/1.1 489
Server: nginx/1.16.1
Date: Wed, 11 Mar 2020 03:14:42 GMT
Content-Length: 0
Connection: keep-alive
10. 长连接配置
在server、http 内 都可以配置
keepalive_timeout number; #设定保持连接超时时长,0表示禁止长连接,默认为75s,通常配置在http字段作为站点全局配置
keepalive_requests number; #在一次长连接上所允许请求的资源的最大数量,默认为100次
#仅测试用,为了显示效果,实际一般不修改
keepalive_requests 2;
#开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断开,后面的60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时时间。
keepalive_timeout 65 60;
telnet www.mage.net 80
# 下面内容直接粘贴到屏幕,然后回车
GET / HTTP/1.1
HOST: www.mage.net
测试:最多可以请求两次。然后就断开连接了 或者超过65秒 Connection closed by foreign host.
root@z2:~# telnet www.mage.net 80
Trying 192.168.1.102...
Connected to www.mage.net.
Escape character is '^]'.
GET / HTTP/1.1
HOST: www.mage.net
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Wed, 11 Mar 2020 03:49:45 GMT
Content-Type: text/html
Content-Length: 7
Last-Modified: Tue, 10 Mar 2020 06:13:18 GMT
Connection: keep-alive
Keep-Alive: timeout=60
ETag: "5e672ffe-7"
Accept-Ranges: bytes
pc web
GET / HTTP/1.1
HOST: www.mage.net
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Wed, 11 Mar 2020 03:49:50 GMT
Content-Type: text/html
Content-Length: 7
Last-Modified: Tue, 10 Mar 2020 06:13:18 GMT
Connection: close
ETag: "5e672ffe-7"
Accept-Ranges: bytes
pc web
Connection closed by foreign host.
11. 作为下载服务器配置
root@z2:~# mkdir /data/nginx/html/pc/download
root@z2:~# vim /apps/nginx/conf/conf.d/pc.conf
root@z2:~# cp -r /data/img/ /data/nginx/html/pc/download/
location /download {
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
root /data/nginx/html/pc;
}
- autoindex on; 开启自动索引功能
- autoindex_exact_size on; #计算文件确切大小(单位bytes),off只显示大概大小(单位kb、mb、gb)
- autoindex_localtime on; #显示本机时间而非GMT(格林威治)时间
访问 www.mage.net/download/ 就可以查看。
注意 在 root目录 /data/nginx/html/pc 内容不会显示, /data/nginx/html/pc/download/ 才会显示
下载速率限制
limit_rate rate; #限制响应给客户端的传输速率,单位是bytes/second,默认值0表示无限制
限速与不限速的对比:
limit_rate 10k;
验证:找一个大文件测试,没有限制之前是90M/s ,而做了限制之后不超过10k/s,大约只有8/9k的样子
12. 作为上传服务器
放在http字段,因为很多服务器都要上传
client_max_body_size 10m;
client_body_buffer_size 16k;
client_body_temp_path /apps/nginx/temp 1 2 2; #reload Nginx会自动创建temp目录
-
client_max_body_size 1m; #设置允许客户端上传单个文件的最大值,默认值为1m
-
client_body_buffer_size size; #用于接收每个客户端请求报文的body部分的缓冲区大小;默认16k;超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置
-
client_body_temp_path path [level1 [level2 [level3]]]; #设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量,目录名为16进制的数字,使用hash之后的值从后往前截取1位、2位、2位作为文件名:
[root@s3 ~]# md5sum /data/nginx/html/pc/index.html 95f6f65f498c74938064851b1bb 96 3d 4 /data/nginx/html/pc/index.html 1级目录占1位16进制,即2^4=16个目录 0-f 2级目录占2位16进制,即2^8=256个目录 00-ff 3级目录占2位16进制,即2^8=256个目录 00-ff