nginx 核心配置示例

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
    
发布了62 篇原创文章 · 获赞 7 · 访问量 1258

猜你喜欢

转载自blog.csdn.net/qq_36801585/article/details/104880401