nginx 常用配置记录

nginx 常用配置记录,第1张

例子

以上一些配置为在该server下具有全局性,例如 root ,可在location中重新定义root

当我们想定义多个server监听同一个端口但访问的host不一样时,server_name就派上用场了。nginx会根据HTTP请求的header Host选择nginx配置文件里符合条件的server_name的server配置

匹配顺序如下

所以当我们监听的的端口只有一个server配置的时候,server_name 可以不填

两者作用差不多,区别在于最终映射的地址不同,例:

简单例子,匹配所有请求

一个正则匹配的例子:

一个反向代理的例子:

vue-router、react-router等路由框架要开启history模式可以选择的nginx配置的例子

location的匹配规则和顺序

还有一种特殊匹配类型 @url ,只用于nginx内部跳转,例:

例子:

有常用两种负载均衡支持调度算法,分别是 weight ip_hash 。weight 模式下可以为每个 server 设置weight值,weight值越大,分配到的访问机率越高,ip_hash 为同一个ip的

分配同一个后端服务器,这样我们不用解决session共享问题。

例子:

mime type 和 文件扩展名的对应关系一般放在 mime.types 里,然后 用 include mime.types

mime.types作用:通过文件的扩展名设置了Content-Type,Nginx如果没找到对应文件的扩展名的话,就使用默认的Type,默认Type通用 default_type 定义,比如 default_type application/octet-stream

完整的 mime.types 配置: https://github.com/h5bp/server-configs-nginx/blob/master/mime.types

一个虚拟主机对一个文件配置,放到vhost文件夹下面,然后通过include指令包含进来,这样更便于维护和管理

配置:

参考:

http://tool.oschina.net/apidocs/apidoc?api=nginx-zh

https://www.jianshu.com/p/bed000e1830b

Content-Type属性指定请求和响应的 HTTP 内容类型。如果未指定 ContentType,默认响应的内容类型为 text/html ,默认请求的内容类型为 application/x-www-form-urlencoded 。Content-Type一般只存在于Post方法中,因为Get方法是不含“body”的,它的请求参数都会被编码到url后面,所以在Get方法中加Content-type是无用的。

在 nginx 中有个配置文件 mime.types ,主要是标示 Content-Type 的文件格式。

下面是几个 常见的 Content-Type

application/x-www-form-urlencoded 是常用的表单发包方式,普通的表单提交,或者 js 发包,默认都是通过这种方式,数据被编码为key/value格式发送到服务器。

multipart/form-data 用在 发送文件的POST包

Multipart/form-data的请求头必须包含一个特殊的头信息 : Content-Type , 且其值也必须规定为multipart/form-data , 同时还需要规定一个 内容分割符 即 boundary 用于分割请求体中的多个POST的内容 , 如文件内容和文本内容自然需要分割开来 , 不然接收方就无法正常解析和还原这个文件了。

text/xml 微信用的是这种数据格式发送请求的。XML-RPC(XML Remote Procedure Call)是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。

application\json HTTP通信中并不存在所谓的json,而是将string转成json罢了,也就是,application/json可以将它理解为text/plain,普通字符串。

application\xml XML数据格式

MDN Content-Type

理解HTTP之Content-Type

四种常见的POST提交数据方式

nginx中location对url匹配;

语法:location [=| | *|^~] /uri/ { … }

当匹配中符合条件的location,则执行内部指令;如果使用正则表达式,必须使用 *表明不区分大小写或者 区分大小写匹配;例如:location ~* .(gif|jpg|jpeg)$ ;当配皮成功后,将停止往下匹配;如果没有找到,则使用常规自字符串处理结果;

如果不是用正则表达式;可使用=严格匹配;

如果使用^~前缀用于一个常规字符串;表示如果路径匹配,则不测试正则表达式;

总结:指令按下列顺序被接受

1:=前缀的指令严格匹配这个查询;如果找到停止往下匹配

2:挣下的常规字符串,长的在前,如果这个匹配使用^~前缀,匹配停止;

3:正则表达式,按配置文件的顺序;

4:如果第三步产生匹配。则使用这个结果;停止匹配;否则使用第二部的匹配结果;

四个案例:

八个location案例

当匹配成功后location中可以使用rewrite进行路由重写;

首先需要了解nginx rewrite中可以使用到的全局变量;

$args:请求中get的参数,例如a=1&b=2

$body_remote_add:二进制客户地址

$body_byte_sent:相应时发送出去的body字节数数量,即使链接中断这个数据也是精确的;

$content_length:请求头中的Content_length字段

$content_type:请求中的Content_type字段

$document_root:当前请求在root指令中的位置服务器中绝对路径

$document_url:与uri相同

$host:请求主机头字段,否则为服务器名称;

$hostname:保存了当前请求中不包含指令的uri,例如: http://www.aaa.com/index.php?a=1 中的/index.php

$host:请求的服务器名称;

$http_user_agent:客户端浏览器的详细信息,如果使用 chrome 和Firefox 则访问结果是

location ~* .(gif|jpg|png|bmp) invalid_referer) {

return 403

#rewrite ^/ http://www.aaa.com/1.jpg

}

}以上所有来至aaa.com和域名中包含google和baidu的站点都可以访问到当前站点的图片,如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面,如果使用下面的rewrite,那么盗链的图片都会显示403.jpg。如果用户直接在浏览器输入你的图片地址,那么图片显示正常,因为它符合none这个规则.

location ~* .(gif|jpg|png|swf|flv) invalid_referer) {

return 404

}

}

none:在浏览器输入网站域名直接访问的请求,需要允许访问的

blocked:有referer首部,但是referer首部被清除了,一般是防火墙改过的请求

server_name:带服务器名称的,一般是本机或其他服务器的请求,a.com和*.a.com是本公司的域名,要允许访问于是要先允许本机的访问,再禁止其他服务器的访问

location /public/admin/images/y.jpg {

#valid_referers none blocked *.aaa.com server_names *.aaa.com

#valid_referers none blocked www.sss.com #设置只有该域> 名可以访问

valid_referers none blocked 111.111.111.11#设置只有该域名可以访> 问

if ( request_uri?

return 403

rewrite ^/ http://www.aaa.com/1.jpg

}

}

. : 匹配除换行符以外的任意字符

? : 重复0次或1次

if ( /msie/$1 break

}

if ( )") { # 如果cookie匹配正则,就设置变量 id id等于正则第一个括号内匹配的部分

}

if ($request_method = POST) { #如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302

return 405

}

if ( slow可以通过 set 指令设置

limit_rate 10k

}

if (!-f $request_filename){ #如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查

break

proxy_pass http://127.0.0.1

}

if ($args ~ post=140){ #如果query string中包含"post=140",永久重定向到example.com

rewrite ^ http://example.com/ permanent

}

http {

# 定义image日志格式

log_format imagelog '[ image_file ' ' body_bytes_sent ' ' $status

# 开启重写日志

rewrite_log on

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7973788.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存