NGINX最常用的指令(备用查询)
服务管理sudosystemctlstatusnginxnginx当前状态sudosystemctlreloadnginx重新加载nginxsudosystemctlrestartnginx重启nginxsudonginxt检查语法nginx启动nginxsreload重启nginxsstop关闭进程nginxsquit平滑关闭nginxnginxV查看nginx的安装状态,Docker安装dockerrunnamesomenginxvsomecontent:usrsharenginxhtml:rodnginx简单代理location{proxypasshttp:127。0。0。1:3000;proxyredirectoff;proxysetheaderHosthost;}全局变量
args
这个变量等于请求行中的参数,同querystring
remoteport
客户端的端口
contentlength
请求头中的Contentlength字段
remoteuser
已经经过AuthBasicModule验证的用户名
contenttype
请求头中的ContentType字段
requestfilename
当前请求的文件路径,由root或alias指令与URI请求生成
documentroot
当前请求在root指令中指定的值
scheme
HTTP方法(如http,https)
host
请求主机头字段,否则为服务器名称
hostname
主机名
httpuseragent
客户端agent信息
httpcookie
客户端cookie信息
serverprotocol
请求使用的协议,通常是HTTP1。0或HTTP1。1
serveraddr
服务器地址,在完成一次系统调用后可以确定这个值
servername
服务器名称
serverport
请求到达服务器的端口号
limitrate
这个变量可以限制连接速率
requestmethod
客户端请求的动作,如GETPOST
requesturi
包含请求参数的原始URI,不包含主机名,如:foobar。php?argbaz
remoteaddr
客户端的IP地址
uri
不带请求参数的当前URI,uri不包含主机名,如foobar。html
documenturi
与uri相同
nginxversion
nginx版本
更多全局变量查看官方文档监听端口server{listen80;标准HTTP协议listen443ssl;标准HTTPS协议listen443sslhttp2;对于http2listen〔::〕:80;使用IPv6在80上收听仅收听使用IPv6listen〔::〕:80ipv6onlyon;}域名(servername)server{监听example。comservernameexample。com;监听多个域servernameexample。comwww。example。com;监听所有子域servername。example。com;监听所有顶级域servernameexample。;监听未指定的主机名(监听IP地址本身)servername;}负载均衡(简单实例)upstreamnodejs{server0。0。0。0:3000;server0。0。0。0:4000;server127。155。142。421;}负载均衡(权重)upstreamtest{serverlocalhost:8080weight9;serverlocalhost:8081weight1;}upstreamiphashupstreamtest{iphash;serverlocalhost:8080;serverlocalhost:8081;}
解决负载均衡session的问题upstreamfairupstreambackend{fair;serverlocalhost:8080;serverlocalhost:8081;}
响应时间短的优先分配server可选参数
weight
访问权重数值越高,收到请求越多
failtimeout
指定的时间内必须提供响应
maxfails
尝试失败服务器连接的最大次数
down
标记一个服务器不再接受任何请求
backup
有服务器宕机,标记的机器接收请求
配置示例upstreamtest{server127。0。0。1:83weight9;权重server127。0。0。1:83weight1;权重失败超时时间server127。0。0。1:83maxfails3;server127。0。0。1:83weight3down;}upstreamurlhashupstreambackend{hashrequesturi;hashmethodcrc32;serverlocalhost:8080;serverlocalhost:8081;}
按访问url的hash结果来分配请求upstreamkeepaliveupstreammemcachedbackend{server127。0。0。1:11211;server10。0。0。2:11211;keepalive32;}
激活缓存以连接到上游服务器子文件夹中的代理locationfolder{很重要!proxypasshttp:127。0。0。1:3000;很重要!proxyredirectoff;proxysetheaderHosthost;proxysetheaderXRealIPremoteaddr;proxysetheaderXForwardedForproxyaddxforwardedfor;}反向代理基础server{listen80;servernameexample。com;location{proxypasshttp:0。0。0。0:3000;其中0。0。0。0:3000是绑定在0。0。0。0端口3000列表上的Node。js服务器}}基础(upstream)upstreamnodejs{server0。0。0。0:3000;其中0。0。0。0:3000是绑定在0。0。0。0端口3000列表上的Node。js服务器}server{listen80;servernameexample。com;location{proxypasshttp:nodejs;}}升级连接(适用于支持WebSockets的应用程序)upstreamnodejs{server0。0。0。0:3000;}server{listen80;servernameexample。com;location{proxypasshttp:nodejs;proxyredirectoff;proxyhttpversion1。1;proxysetheaderUpgradehttpupgrade;proxysetheaderConnectionupgrade;proxysetheaderHosthost;}}
适用于Node。js、Streamlit、Jupyter等静态资源(传统Web服务器)server{listen80;servernameexample。com;rootpathtowebsite;rootwwwdata示例,如果里面没有root,它将寻找wwwdataindex。htmllocation{}locationimages{如果里面没有root,它将寻找wwwdataimagesindex。html}locationvideos{由于里面有root,它会寻找wwwmediavideosindex。htmlrootwwwmedia;}}HTTPS协议
大多数SSL选项取决于您的应用程序做什么或需要什么server{listen443sslhttp2;servernameexample。com;sslon;sslcertificatepathtocert。pem;sslcertificatekeypathtoprivkey。pem;sslstaplingon;sslstaplingverifyon;ssltrustedcertificatepathtofullchain。pem;sslprotocolsTLSv1TLSv1。1TLSv1。2;sslsessiontimeout1d;sslsessioncacheshared:SSL:50m;addheaderStrictTransportSecuritymaxage15768000;}
您可以使用LetsEncrypt轻松保护您的网站应用程序。去letsencrypt获取更多信息重定向(301永久)
将www。example。com重定向到example。comserver{listen80;servernamewww。example。com;return301http:example。comrequesturi;}
将http重定向到httpsserver{listen80;servernameexample。com;return301https:example。comrequesturi;}重定向(302临时)server{listen80;servernameyourdomain。com;return302http:otherdomain。com;}永久重定向到HTTPS安全域server{listen80;servernameyourdomain。com;return301https:hostrequesturi;}重定向参数
permanent
永久性重定向。日志中的状态码为301
redirect
临时重定向。日志中的状态码为302HTTP请求端真实的IPlocation{proxysetheaderXForwardedForremoteaddr;}示例websocket的代理keepaliveUpstreamsupstreambackend{server127。0。0。1:3000;keepalive5;}HTTPServerserver{servernameyourhostname。com;errorlogvarlognginxrocketchat。access。log;location{proxypasshttp:backend;proxyhttpversion1。1;proxysetheaderUpgradehttpupgrade;proxysetheaderConnectionupgrade;proxysetheaderHosthttphost;proxysetheaderXRealIPremoteaddr;proxysetheaderXForwardForproxyaddxforwardedfor;proxysetheaderXForwardProtohttp;proxysetheaderXNginxProxytrue;proxyredirectoff;}}Apache的反向代理server{servernamedomain。tld;accessloglogdomain。tld。access。log;errorloglogdomain。tld。error。log;rootvarwwwdomain。tldhtdocs;将请求传递给Apache后端location{proxypasshttp:backend;}使用后备处理静态文件location。(oggogvsvgsvgzeototfwoffwoff2ttfm4amp4ttfrssatomjpe?ggifcurheicpngtifficozipwebmmp3aactgzgzrarbz2docxlsexeppttarmidmidiwavbmprtfswfwebp){addheaderAccessControlAllowOrigin;accesslogoff;lognotfoundoff;expiresmax;tryfilesurifallback;}如果找不到文件,则回退以将请求传递给Apachelocationfallback{proxypasshttp:backend;}}Gitlab的反向代理server{侦听的80端口listen80;servernamegit。example。cn;location{proxypasshttp:localhost:3000;以下是一些反向代理的配置可删除proxyredirectoff;后端的Web服务器可以通过XForwardedFor获取用户真实IPproxysetheaderHosthost;clientmaxbodysize10m;允许客户端请求的最大单文件字节数clientbodybuffersize128k;缓冲区代理缓冲用户端请求的最大字节数proxyconnecttimeout300;nginx跟后端服务器连接超时时间(代理连接超时)proxysendtimeout300;后端服务器数据回传时间(代理发送超时)proxyreadtimeout300;连接成功后,后端服务器响应时间(代理接收超时)设置代理服务器(nginx)保存用户头信息的缓冲区大小proxybuffersize4k;proxybuffers缓冲区,网页平均在32k以下的话,这样设置proxybuffers432k;高负荷下缓冲大小(proxybuffers2)proxybusybufferssize64k;}}重定向整个网站server{servernameoldsite。com;return301scheme:newsite。comrequesturi;}重定向单页server{locationoldpage。html{return301http:example。orgnewpage。html;}}重定向整个子路径locationoldsite{rewriteoldsite(。)http:example。orgnewsite1permanent;}负载均衡upstreamexample{iphash;upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。server192。168。122。11:8081;server127。0。0。1:82weight3;server127。0。0。1:83weight3down;server127。0。0。1:84weight3;maxfails3failtimeout20s;server127。0。0。1:85weight4;;keepalive32;}server{侦听的80端口listen80;servernamegit。example。cn;location{在这里设置一个代理,和upstream的名字一样proxypasshttp:example;}}内容缓存
允许浏览器基本上永久地缓存静态内容。Nginx将为您设置Expires和CacheControl头信息locationstatic{rootdata;expiresmax;}
如果要求浏览器永远不会缓存响应(例如用于跟踪请求),请使用1locationempty。gif{emptygif;expires1;}跨域问题server{listen80;servernameapi。xxx。com;addheaderAccessControlAllowOrigin;addheaderAccessControlAllowCredentialstrue;addheaderAccessControlAllowMethodsGET,POST,HEAD;location{proxypasshttp:127。0。0。1:3000;proxysetheaderXRealIPremoteaddr;proxysetheaderXForwardedForproxyaddxforwardedfor;proxysetheaderHosthttphost;}}重定向URI来解决跨域问题upstreamtest{server127。0。0。1:8080;serverlocalhost:8081;}server{listen80;servernameapi。xxx。com;location{roothtml;去请求。。html文件夹里的文件indexindex。htmlindex。htm;首页响应地址}用于拦截请求,匹配任何以api开头的地址,匹配符合以后,停止往下搜索正则。locationapi{代表重写拦截进来的请求,并且只能对域名后边的除去传递的参数外的字符串起作用例如www。a。comapimsg?meth1par2重写,只对apimsg重写。rewrite后面的参数是一个简单的正则api(。),1代表正则中的第一个(),2代表第二个()的值,以此类推。rewriteapi(。)1break;把请求代理到其他主机其中http:www。b。com写法和http:www。b。com写法的区别如下如果你的请求地址是他http:serverhtmltest。jsp配置一:http:www。b。com后面有将反向代理成http:www。b。comhtmltest。jsp访问配置一:http:www。b。com后面没有有将反向代理成http:www。b。comtest。jsp访问proxypasshttp:test;如果proxypassURL是http:a。xx。complatform这种情况proxycookiepath应该设置成platform(注意两个斜杠之间有空格)。proxycookiepathplatfrom;设置Cookie头通过proxypassheaderSetCookie;}}跳转到带www的域上面server{listen80;配置正常的带www的域名servernamewww。wangchujiang。com;roothomewwwwabgdownload;location{tryfilesuriuriindex。html404;}}server{将不带www的wangchujiang。com永久性重定向到https:www。wangchujiang。comservernamewangchujiang。com;rewrite(。)https:www。wangchujiang。com1permanent;}代理转发upstreamserverapi{api代理服务地址server127。0。0。1:3110;}upstreamserverresource{静态资源代理服务地址server127。0。0。1:3120;}server{listen3111;servernamelocalhost;这里指定域名roothomewwwserverstatics;匹配api路由的反向代理到API服务locationapi{rewrite(。)1break;proxypasshttp:serverapi;}假设这里验证码也在API服务中locationcaptcha{rewrite(。)1break;proxypasshttp:serverapi;}假设你的图片资源全部在另外一个服务上面locationimg{rewrite(。)1break;proxypasshttp:serverresource;}路由在前端,后端没有真实路由,路由不存在的404状态的页面返回index。html使用场景,用在ReactVue项目没有真实路由location{tryfilesuriuriindex。html404;空格很重要}}屏蔽IP
可以放到http,server,location,limitexcept语句块includeblockip。conf;
在blockip。conf里面输入内容,如:deny165。91。122。67;denyIP;屏蔽单个ip访问allowIP;允许单个ip访问denyall;屏蔽所有ip访问allowall;允许所有ip访问deny123。0。0。08;屏蔽整个段即从123。0。0。1到123。255。255。254访问的命令deny124。45。0。016;屏蔽IP段即从123。45。0。1到123。45。255。254访问的命令deny123。45。6。024;屏蔽IP段即从123。45。6。1到123。45。6。254访问的命令如果你想实现这样的应用,除了几个IP外,其他全部拒绝allow1。1。1。1;allow1。1。1。2;denyall;强制将http重定向到httpsserver{listen80;servernameexample。com;rewritehttps:httphostrequesturi?permanent;强制将http重定向到https在错误页面和服务器响应头字段中启用或禁用发射nginx版本。防止黑客利用版本漏洞攻击servertokensoff;}代理转发连接替换locationapiupload{rewrite(。)wfsv1uploadbreak;proxypasshttp:wfsapi;}
将地址apiupload替换为wfsv1upload爬虫UserAgent过滤location{if(httpuseragentpythoncurljavawgethttpclientokhttp){return503;}正常处理。。。}图片防盗链location。(gifjpgpngswfflv){roothtml;validreferersnoneblocked。nginx。com;if(invalidreferer){rewritewww。nginx。cn;return404;}}虚拟目录配置locationimg{aliasvarwwwimage;}访问img目录里面的文件时,会自动去varwwwimage目录找文件locationimg{rootvarwwwimage;}访问img目录下的文件时,会去varwwwimageimg目录下找文件屏蔽文件目录
通用备份和归档文件location。(oldorigoriginalphpphpphpbaksaveswoaspx?tplshbashbak?cfgcgidllexegithginijsplogmdboutsqlsvnswptarrdf)34;{denyall;}
拒绝访问。git和。svn目录location(。git。svn){denyall;}
拒绝访问隐藏文件和目录location。(?!wellknown){denyall;}防盗图配置locationpublic(cssjsimg)。。(jscssgifjpgjpegpngbmpswf){validreferersnoneblocked。jslite。io;if(invalidreferer){rewritehttp:wangchujiang。compiratesp。png;}}阻止常见攻击base64编码的网址location(base64encode)(。)((){denyall;}javascripteval()urllocation(eval(){denyall;}Gzip配置gzipon;gzipbuffers168k;gzipcomplevel6;gziphttpversion1。1;gzipminlength256;gzipproxiedany;gzipvaryon;gziptypestextxmlapplicationxmlapplicationatomxmlapplicationrssxmlapplicationxhtmlxmlimagesvgxmltextjavascriptapplicationjavascriptapplicationxjavascripttextxjsonapplicationjsonapplicationxwebappmanifestjsontextcsstextplaintextxcomponentfontopentypeapplicationxfontttfapplicationvnd。msfontobjectimagexicon;gzipdisablemsie6;使网站不可索引addheaderXRobotsTagnoindex;locationrobots。txt{return200Useragent:Disallow:;}另见Nginx安装维护入门学习笔记(jaywcjlove。github。io)(virtubox。github。io)