Nginx全局变量Nginx中有很多全局变量,可以通过$变量名来使用。下面列出一些常用的全局变量:变量说明$args请求中的参数,比如www.123.com/1.php?a=1&b=2$args是a=1&b=2$content_lengthHTTP请求信息》内容-HTTP请求信息中的Length"$conten_type"Content-Type"$document_rootnginx虚拟主机配置文件中root参数对应的值$document_uri当前请求不包含指令的URI,如www.123。com/1.php?a=1&b=2的$document_uri为1.php,不包括后面的参数$host主机头,为域名的详细信息$http_user_agent客户端,为浏览器标识.使用curl-A指定$http_cookie客户端的cookie信息$limit_rate如果nginx服务器使用limit_rate配置显示网络速率,则会显示。如果未设置,则会显示。$remote_addr客户端的公网ip$remote_port客户端的端口$remote_user如果nginx有配置认证,这个变量代表客户端认证后的用户名$request_body_file是发送到后端服务器的本地资源名称它用作反向代理。$request_method是请求资源的方式,比如GET/PUT/DELETE。$request_filename是当前请求资源文件的路径名,相当于$document_root/和$document_uri的组合$request_uri请求的链接,包括$document_uri和$args$scheme请求的协议,比如ftp,http,https$server_protocol客户端请求资源使用的协议版本,如HTTP/1.0、HTTP/1.1、HTTP/2.0等$server_addr服务器IP地址$server_name服务器主机名$server_port服务器端口号$uri是同$document_uri$http_referer客户端请求时的referer,通俗的说就是请求跳过的链接,使用curl-e可以指定Nginxlocationlocation的作用location命令的作用是根据用户的要求URI用于执行不同的应用,即根据用户请求的网站地址的URL进行匹配,匹配成功则执行相应的操作。location语法规则:location[=|~|~*|^~]/uri/{...}location的匹配变量为$uri几个字符的说明字符说明=表示完全匹配~表示区分大小写正则匹配~*表示不区分大小写正则匹配^~表示uri以指定字符或字符串开头/通用匹配,任何请求都会被匹配RulePriority=higherthan^~higherthan~*equalto~higherthan/例1location="/12.jpg"{...}例如:www.syushin.com/12.jpg匹配www.syushin.com/abc/12.jpg不匹配location^~"/abc/"{...}如:www.syushin.com/abc/123.html匹配www.syushin.com/a/abc/123.jpg不匹配location~"png"{...}如:www.syushin.com/aaa/bbb/ccc/123.png匹配www.syushin.com/aaa/png/123.html匹配位置~*"png"{...}例如:www.syushin.com/aaa/bbb/ccc/123.PNG匹配www.syushin.com/aaa/png/123.html匹配location/admin/{...}如:www.syushin.com/admin/aaa/1.php匹配www.syushin.com/123/admin/1.php不匹配注意:有资料介绍location支持不匹配!~比如:location!~'png'{...}这个是错误的,location不支持!~如果有这样的需求,可以使用if(location优先级低于if),如:if($uri!~'png'){...}访问控制在web2.0时代,很多网站以用户为中心,允许用户向服务器发布内容。由于上传功能是为用户开放的,存在很大的安全隐患,如黑客上传木马程序等。因此,访问控制是很有必要配置的。Deny和allow从字面上看很容易理解就是拒绝和允许。Nginx的deny和allow命令由ngx_http_access_module模块提供,默认内置在Nginx安装中。语法语法:允许/拒绝地址|网段|Unix:|all表示允许/拒绝访问某个ip或某个ip段。如果指定unix:,它将允许套接字访问。注:Unix是1.5.1新增的特性。在nginx中,允许和拒绝规则是按顺序执行的。示例1:location/{allow192.168.0.0/24;允许127.0.0.1;denyall;}解释:该配置值允许来自192.168.0.0/24网段和127.0.0.1的请求,拒绝所有其他源IP。示例2:location~"admin"{allow192.168.30.7;denyall}解释:要访问的uri包含来自admin的请求,只允许来自IP192.168.30.7的请求。基于位置的访问控制一般来说,访问控制基本上是结合位置来配置的,我们直接举个例子。示例1:location/blog/{denyall;}解释:对于/blog/目录,禁止所有访问,这里denyall;可以改成return403;。例2location~".bak|\.ht"{return403;}说明:如果访问的uri中包含.bak或.ht,则直接返回403状态码。测试链接示例:www.syushin.com/abc.bakwww.syushin.com/blog/123/.htalskdjf如果用户输入的URL是以上其中之一,则返回403。示例3location~(data|cache|tmp|image|attachment).*\.php${denyall;}解释:请求的uri包含data、cache、tmp、image、attachment,以.php结尾,全部禁止使用权。测试链接示例:www.xxxxxx.com/aming/cache/1.phpwww.xxxxxxx.com/image/123.phpswww.xxxxxx.com/aming/datas/1.php基于$document_uri的访问控制内置前面介绍了变量$document_uri的含义是当前请求中不包含指令的URI。比如www.123.com/1.php?a=1&b=2的$document_uri为1.php,不包括以下参数。我们可以对这个变量做访问控制。示例1if($document_uri~"/admin/"){return403;}解释:当请求的uri包含/admin/时,直接返回403。注意:if结构不支持allow和deny。测试链接:1.www.xxxxx.com/123/admin/1.html匹配2.www.xxxxx.com/admin123/1.html不匹配3.www.xxxxx.com/admin.php不匹配Example2if($document_uri=/admin.php){return403;}说明:当请求的uri为/admin.php时,返回403状态码。测试链接:1.www.xxxxx.com/admin.php#匹配2.www.xxxxx.com/123/admin.php#不匹配示例3if($document_uri~'/data/|/cache/.*\.php$'){return403;}解释:当请求的uri包含数据或缓存目录且为php时,返回403状态码。测试链接:1.www.xxxxx.com/data/123.php#匹配2.www.xxxxx.com/cache1/123.php#根据$request_uri访问控制不匹配$request_uri比$docuemnt_uri请求参数多.主要是控制请求的uri中的参数。例子if($request_uri~"gid=\d{9,12}"){return403;}解释:\d{9,12}是一个正则表达式,代表9到12个数字,比如gid=1234567890就是一个符号要求。测试链接:1.www.xxxxx.com/index.php?gid=1234567890&pid=111匹配2.www.xxxxx.com/gid=123不匹配请求是这样的:/read-123405150-1-1.html其实这样的请求不是正常的请求,网站会抛出一个页面,提示帖子不存在。所以对于这样的请求,可以直接返回403状态码。基于$http_user_agent的访问控制(反爬虫)user_agent可以简单理解为一个浏览器标识,包括一些蜘蛛爬虫都可以通过user_agent来识别。如果观察访问日志,会发现一些搜索引擎蜘蛛访问该网站的频率很高,而且不友好。为了减轻服务器的压力,其实可以屏蔽除主流搜索引擎蜘蛛以外的所有蜘蛛爬虫。示例if($http_user_agent~'YisouSpider|MJ12bot/v1.4.2|YoudaoBot|Tomato'){return403;}说明:user_agent包含上述关键字的所有请求都会返回403状态码。测试:1.curl-A"123YisouSpider1.0"2.curl-A"MJ12bot/v1.4.1"基于$http_referer的访问控制$http_referer不仅可以实现防盗链功能,还可以满足一些特殊需求。例如:网站被黑,搜索引擎收录的网页有问题。当通过搜索引擎点击该网站时,会显示一个赌博网站。由于发现木马需要时间,因此无法立即解决。为了不影响用户体验,可以对此类请求进行特殊操作。比如从百度访问的链接可以直接返回一个404状态码,或者返回一段html代码。例子if($http_referer~'baidu.com'){return404;}或者if($http_referer~'baidu.com'){return200"";}Nginx参数优化作为高性能的web服务器,Nginx即使不专门调整配置参数也可以处理大量的并发请求。当然配置调优会让Nginx更加强大,配置参数需要结合服务器硬件性能进行参考。Worker进程优化worker_processesnum;该参数表示启动多少个worker进程,建议保持与本机相同的CPU核数。每个核心CPU处理一个进程,num代表一个数字。worker_rlimit_nofile表示Nginx可用的最大文件描述符数,需要与系统的最大描述符匹配。建议设置为102400,还需要在系统中执行ulimit-n102400。也可以直接修改配置文件/etc/security/limits.conf修改添加:#*softnofile655350(去掉前面的#)#*hardnofile655350(去掉前面的#)worker_connections这个参数用来配置每个Nginx工作进程处理的最大连接数。该参数还决定了Nginx服务器最多可以处理多少个客户端请求(worker_processes*worker_connections)。这个参数建议设置为10240,不建议太大。optimizethenumberofhttp/tcpconnectionsuseepoll使用epoll方式的事件驱动模型,这是linux系统下最优的方式。multi_accepton使每个工作进程能够同时处理多个客户端请求。sendfileon利用了内核的fd文件传输功能,可以减少用户态和内核态的切换,从而提高服务器性能。tcp_nopushon当tcp_nopush设置为on时,会调用tcp_cork方法进行数据传输。使用这种方式会产生这样的效果:当应用程序产生数据时,内核不会立即封装数据包,而是在数据量累积到一定数量时再进行封装,然后再进行传输。tcp_nodelayon不缓存数据发送(关闭Nagle算法),可以提高高频发送小数据包的实时性。(关于Nagle算法)【如果需要频繁发送一些小数据包,比如1字节,以IPv4为例,每个数据包必须有一个40字节的包头,即一共41字节的data,只有1个字节是我们需要的数据。为了解决这个问题,Nagle算法出现了。规定如果数据包的大小满足MSS,就可以立即发送,否则数据会被放入buffer,确认发送的数据包后才能继续发送。通过这样的规定,可以减少网络中小数据包的数量,从而提高网络性能。keepalive_timeout定义了长连接的超时时间。建议30s。太短或太长都可能不合适。当然最好根据业务本身动态调整这个参数。keepalive_requests定义了当客户端和服务端处于长连接时,每个客户端最多可以请求多少次,可以设置很大,比如50000.reset_timeout_connectionon设置为on,此时客户端不再向服务端发送请求,服务器被允许关闭连接。client_body_timeout如果客户端在指定时间内没有加载正文数据,连接将被断开。单位是秒。默认为60,可以设置为10。send_timeout的超时时间为发送响应的超时时间,即Nginx服务器向客户端发送了一个数据包,但是客户端还没有收到数据包.如果连接超过send_timeout定义的超时时间,Nginx将关闭连接。单位是秒,可以设置为3。压缩对于纯文本内容,Nginx可以使用gzip压缩。使用压缩技术可以减少带宽的消耗。ngx_http_gzip_module模块支持的配置如下:gzipon;//开启gzip功能gzip_min_length1024;//压缩前设置请求的资源超过这个值,单位字节gzip_buffers168k;//设置用于压缩的缓冲区大小,第一个数字第二个是每个缓冲区的大小gzip_comp_level6;//设置压缩级别,取值范围为1-9,9为最高压缩级别,最消耗CPU资源gzip_typestext/plainapplication/x-javascripttext/cssapplication/xmlimage/jpegimage/gifimage/png;//指定哪些类型的文件需要压缩gzip_disable"MSIE6\.";//IE6浏览器不开启压缩测试:curl-I-H"Accept-Encoding:gzip,deflate"http://www.xxxxx.com/1.csslogerror日志级别提高,比如crit级别,尽量少记录无关的日志。对于访问日志,如果不需要记录,可以关闭。静态资源访问日志已关闭。静态文件过期对于静态文件,需要设置一个过期时间,这样这些资源才能缓存到客户端浏览器。在缓存过期之前,客户端不再向服务器请求相同的资源,从而节省了带宽和资源消耗。配置示例如下:location~*^.+\.(gif|jpg|png|css|js)${expires1d;//1d表示1天,或者24h表示一天。}访问控制和调参只记录其中的一部分,有些可能在工作中会用到。稍后记录一下SSL配置。
