当前位置: 首页 > 后端技术 > PHP

Nginx常用配置

时间:2023-03-29 18:33:17 PHP

废话不多说,直接进入配置主题。如果你对nginx一无所知,请跳转到Nginx入门实战(一)基础。在此之前,首先将配置参数的location分为四层1.confglobal层2.httpserver层3.server虚拟主机层4.location定位层1.global层#有1个工作子进程,可以是自己修改,但是太大没用,因为需要争cpu,一般设置为CPUNumber*coresnumberworker_processes1;#一般是配置nginx连接的特性,比如一个子进程可以同时允许多少个连接Event{#这个意思是一个子进程最多可以连接1024个连接worker_connections1024;}#这是为了配置http服务器http的主要部分{#这是虚拟主机部分Server1{#定位,重定位特殊路径或文件,比如图片目录单独处理,比如.php单独处理Location{...}}Server2{...}}2.HTTP服务器层1.网页内容压缩编码和传输速度优化Request:Accept-Encoding:gzip,deflate,sdchResponse:Content-Encoding:gzipContent-Length:36093原理:Browser---Request---->声明可以接受gzip压缩或deflate压缩或compress或sdch压缩。从http协议来看——请求头声明accept-encoding:gzipdeflatesdch(指压缩算法,其中sdch是Google提倡的一种压缩方式,目前支持的服务器不多)Server-->响应---将内容用gzip压缩---->发送到浏览器浏览<-----解码gzip-----接收gzip压缩内容gzip#配置公共参数gzipon|off;#是否打开gzipgzip_buffers324K|168K#Buffering(内存中压缩了多少块?每个块有多大?)gzip_comp_level#[1-9]#推荐6个压缩级别(级别越高,压缩越小,CPU计算越浪费resources)gzip_disable#正则匹配UA什么样的Uri不执行gzipgzip_min_length200#开始压缩的最小长度(再小不压缩也没意义)gzip_http_version1.0|1.1#http协议版本到开始压缩(可以不设置,目前几乎都是1.1协议))gzip_proxied#设置请求者的代理服务器,如何缓存内容gzip_typestext/plainapplication/xml#对哪些类型的文件使用压缩,比如astxt,xml,html,css,如果不知道类型名,可以查看nginx下的conf文件夹mime.typesgzip_varyon|off#是否传输gzip压缩标志注:图片/mp3等二进制文件不需要压缩,因为压缩rate比较小,比如100->80bytes,压缩也会消耗CPU资源。较小的文件不需要压缩。2、缓存设置对于网站图片,尤其是新闻网站,图片一旦发布,变化可能很小。我们希望用户访问一次后,图片缓存在用户的浏览器中,缓存时间比较长。是的,使用nginx的expires设置。#在位置或如果部分过期30秒;30米到期;2小时后到期;30天后到期;location~image{expires1d;}另:304也是一种很好的缓存方式原理是:服务端响应文件内容,同时响应etag标签(内容的签名,如果内容发生变化,它也会改变)和last_modified_since2个标签值。浏览器下次请求时,头信息发送这两个标签,服务器检测文件是否有变化。如果没有变化,header信息直接返回etag。last_modified_因为浏览器知道内容没有变化,所以直接调用本地缓存。在这个过程中,服务器也有请??求,但是传输的内容很少。对于变化周期短的,比如静态的html、js、css,更适合使用这种方式3.虚拟主机层#基于域名服务器的虚拟主机{listen80;#监听端口server_namea.com;#监听域名位置/{root/var/www/a.com;#根目录定位索引index.html;}}#基于端口的虚拟主机配置access192.xxx.xx.xxx:8080server{listen8080;#监听8080端口server_name192.xxx.xx.xxx;#服务器IP地址位置/{root/var/www/html8080;索引index.html;}}1.日志管理#不同的服务器可以使用不同的日志#这里定义了日志格式,最好放在最顶层,这样其他服务器可以共享log_formatmain'$remote_addr-$remote_user[$time_local]"$request"'#'$status$body_bytes_sent"$http_referer"'#'"$http_user_agent""$http_x_forwarded_for"';$remote_addr用户ip$remote_user[$time_local]用户访问时间$request请求类型get,post...$status请求状态200304...$body_bytes_sent请求的内容有多少字节$http_referer上一页来自哪里(从哪里跳转到)$http_user_agent用户代理(用什么浏览器访问)#这里说明服务器,它的访问日志文件,使用的是主格式的格式。access_loglogs/host.access.logmain;每天半夜写个sh脚本拆分日志Log,避免每天日志过多导致日志堆积#!/bin/bashbase_path='/usr/local/nginx/logs'log_path=$(date-dyesterday+"%Y%m")day=$(date-d昨天+"%d")mkdir-p$base_path/$log_pathmv$base_path/access.log$base_path/$log_path/access_$day.log#echo$base_path/$log_path/access_$day.logkill-USR1`cat/usr/local/nginx/logs/nginx.pid`#crontab编辑定时任务0100***/xxx/path/b.sh每天00:01(推荐在02-04之间,系统负载小)4、Location层1.locationlocationlocation有“位置”的意思,根据Uri进行不同的定位,在虚拟主机的配置中,必不可少的location可以用不同的处理方法定位网站的不同部分。当我们遇到“.php”时,如何调用PHP解释器呢?--此时需要location#location的语法。location[=|~|~*|^~]patt{...}#方括号里不能写任何参数这时候叫一般匹配#也可以写参数#所以大类型可以分into3types#首先检查是否存在精确匹配,如果存在则停止匹配过程,如果没有向下匹配到最合适的locationlocation=patt{}#[精确匹配]locationpatt{}#[一般匹配]location~patt{}#【正则匹配】匹配顺序示例1location/{root/usr/local/nginx/html;索引index.html索引。htm;}location~image{root/var/www/image;indexindex.html;}#如果我们访问http://xx.com/image/logo.png#这时候“/”和“/image/logo.png”匹配#同时匹配“image”regular和"image/logo.png"也可以匹配,谁来发挥作用?#将使用正则表达式的结果。#图片实际上会访问/var/www/image/logo.png#注意,如果roo末尾加'/',那么会访问/var/www/image/image/logo.png。示例2location/{root/usr/local/nginx/html;指数指数。html索引.htm;}位置/foo{root/var/www/html;indexindex.html;}#我们访问http://xxx.com/foo#对于uri"/foo",两个位置的patt,都可以匹配到它们#即'/'可以匹配来自的'/foo'左前缀,'/foo'也可以从左前缀匹配'/foo',#这时候才真正访问/var/www/html/index.html#原因:'/foo'匹配较长,所以使用总结:先判断准确命中,如果命中,立即返回结果,结束解析过程,判断正常命中,如果有多个hits,记录最远的命中结果为准(记录但不结束)。继续判断正则表达式的解析结果,按照配置中正则表达式的顺序,从上到下。一旦匹配成功,立即返回结果并结束解析。分析:普通命中无先后顺序,常规命中是根据命中的长度来确定的,顺序为2.rewriterewrite#rewrite中使用的指令if(condition){}#设置条件,然后rewriteset#设置变量return#返回状态码break#跳出rewriterewrite#Rewrite#If语法格式ifspace(condition){rewritemode}#Condition语法1:“=”判断是否相等,用于字符串比较2:“~”要使用正则匹配(这里的正则是区分大小写的)~*不区分大小写的正则3:-f-d-e判断是文件,目录,是否存在。示例location/{#访问ip相等时,返回403if($remote_addr=192.xxx.xx.xx){return403;}#如果是IE浏览器访问if($http_user_agent~MSIE){rewrite^.*$/ie.htm;休息;#如果不break,被重定向后,会再次匹配IE浏览器,走到这一步会循环重定向}#如果访问的目录或文件不存在,则重定向到404页面if(!-e$document_root$fastcgi_script_name){重写^.*$/404.html中断;}根html;indexindex.html}以xx.com/dsafsd.html为例,我们观察访问日志,日志中显示的访问路径依然是GET/dsafsd.htmlHTTP/1.1prompt:therewriteinsidetheserverisdifferentfrom302重定向。跳转的话,url会变,会是一个新的http请求404.html,但是内部rewrite,context不会变,也就是说fastcgi_script_name还是dsafsd.html,所以会循环重定向.set用于设置变量,在判断多个条件时可以作为标志,实现apache下rewrite_condition的效果#使用set方法防止重定向死循环if($http_user_agent~*msie){set$isie1;}if($fastcgi_script_name=ie.html){设置$isie0;}if($isie1){重写^.*$ie.html;}3.Nginx配合PHP#遇到访问.php位置时~\.php${roothtml;#将请求的信息转发给9000端口的PHP进程fastcgi_pass127.0.0.1:9000;fastcgi_indexindex.php;#告诉php进程你要运行哪个php文件fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;includefastcgi_params;}#1:遇到一个php文件,#2:定位根目录到html,#3:将请求上下文传递给9000端口的PHP进程,#4:告诉PHP进程当前脚本是$document_root$fastcgi_scriptname#(注意:PHP会找到这个脚本并进行处理,所以脚本的位置一定要正确)4.反向代理+负载均衡使用nginx做反向代理和负载均衡非常简单。只需要两个配置,一个proxy,一个upstream,分别用于反向代理和负载均衡。以反向代理为例,nginx并不自己处理PHP相关的请求,而是将PHP相关的请求转发给Apache进行处理。#将php程序传递给8080端口的apache进行处理,实现动静分离location~\.php${proxy_passhttp://xxx.xxx.xx:8080}http{...#loadbalancingserverpoolupstreamxxx{服务器127.xx.xx.xx1;服务器127.xx.xx.xx2;}服务器{liseten80;服务器名称本地主机;location/{#用户真实IPproxy_set_headerX-Real-IP$remote_addr;proxy_passhttp://xxx#upstream对应自定义名称includeproxy.conf;}}}有收获的小伙伴记得点赞或者收藏哦~