主页 > 网赚优化 > 你需要知道的Nginx配置二三事

你需要知道的Nginx配置二三事

你需要知道的Nginx配置二三事

Nginx是俄罗斯人Igor Sysoev基于C语言编写的十分轻量级的HTTP服务器,它主要有以下特点:

  • 它是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器;

  • Nginx使用异步事件驱动的方法来处理请求,Nginx的模块化事件驱动架构可以在高负载下提供更可预测的性能;

  • 作为Web服务器,Nginx处理静态文件、索引文件,自动索引的效率非常高

  • 作为反向代理服务器,Nginx可以实现反向代理加速,提高网站运行速度

  • 作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡

  • Nginx是专门为性能优化而开发的,非常注重效率,Nginx在官方测试的结果中,能够支持五万个并行连接,而在实际的运作中,可以支持二万至四万个并行链接

  • 在高可用性方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级

nginx如何配置?

Nginx的配置文件默认存放路径是etc/nginx/nginx.conf,可以在Nginx启动时添加参数–conf-path=PATH来更改nginx.conf文件的存放路径。nginx.conf中的配置信息主要包含以下五个部分:

  • main(全局设置):主要是包括Nginx工作进程,日志的配置以及server,location中一些共用的配置

  • events(连接设置):主要包括Nginx连接信息的配置

  • server(主机设置):主要是包括主机名称,Ip,路径解析,http请求头设置,反向代理等配置

  • upstream(上游服务器设置):主要为反向代理服务器信息、负载均衡等相关配置

  • location(URL匹配):特定URL的匹配设置

以上每部分包含若干个条指令,他们之间的关系是:server继承main,location继承server,main部分设置的指令将影响其它所有部分的设置,server部分的设置将影响到location部分的设置。upstream既不会继承指令也不会被继承,它有自己的特殊指令,不需要在其他地方的应用。

nginx中location部分url如何匹配?

location主要是匹配url中除去server_name(主机名)后的部分,其中关于url的匹配规则有以下几种:

  • 精确匹配:以“=”开头表示精确匹配

  • 开头匹配:^~ 表示uri以某个常规字符串开头,不是正则匹配

  • 区分大小写的正则匹配:~开头表示区分大小写的正则匹配

  • 不区分大小写的正则匹配:~* 开头表示不区分大小写的正则匹配

  • 通用匹配:匹配url的前面部分

对于上述五类匹配,它们之间的匹配顺序和优先级关系如下:

  • 不同类型之间匹配和location的顺序无关,只和优先级有关,各种匹配规则的优先级关系是: [精确匹配] > [开头匹配] > [正则匹配] > [通用匹配];

  • 除了通用匹配,开头匹配以外,相同类型的匹配优先级只和顺序有关,排在前面的优先匹配;

  • 通用匹配和开头匹配的优先级与通用匹配的最长字符串有关,通用字符串越长,匹配优先级越高;

下面是我设置的几个location,并测试和验证以上匹配规则:


  1. server {

  2. listen 80 default_server;

  3. server_name dev.zdp.com;

  4.  
  5. # 通用匹配 [匹配规则0]

  6. location /

  7. {

  8. return 302 https://dashboard.youdata.com;

  9. }

  10.  
  11. # 通用匹配 [匹配规则1]

  12. location /hello

  13. {

  14. return 302 https://dashboard.youdata.com;

  15. }

  16.  
  17. # 通用匹配 [匹配规则2]

  18. location /hello/no

  19. {

  20. return 302 https://dev.youdata.com;

  21. }

  22.  
  23. # 不区分大小写的正则匹配 [匹配规则3]

  24. location ~* /hello/y[a-e][a-z][1-9]

  25. {

  26. return 302 https://test.youdata.com;

  27. }

  28.  
  29. # 区分大小写的正则匹配 [匹配规则4]

  30. location ~ /hello/y[A-E][E-Z][1-9]

  31. {

  32. return 302 https://pre.youdata.com;

  33. }

  34.  
  35. # 区分大小写的正则匹配 [匹配规则5]

  36. location ~ /hello/y[a-e][e-z]

  37. {

  38. return 302 https://pre163.youdata.com;

  39. }

  40.  
  41. # 开头匹配 [匹配规则6]

  42. location ^~ /hello/yes

  43. {

  44. return 302 https://youdata.netease.com;

  45. }

  46.  
  47. # 开头匹配 [匹配规则7]

  48. location ^~ /hello/yesno

  49. {

  50. return 302 https://youdata.163.com;

  51. }

  52.  
  53. # 精确匹配 [匹配规则8]

  54. location = /hello

  55. {

  56. return 302 https://www.baidu.com;

  57. }

  58.  
  59. }

location用例测试:

  • “http://dev.zdp.com/hello” ——- 精确匹配优先,命中[匹配规则8]

  • “http://dev.zdp.com/hello/yesnoOk” ——- 开头匹配优先,开头匹配同时满足条件时,长优先,命中[匹配规则7]

  • “http://dev.zdp.com/hello/yesOk” ——- 开头匹配优先,命中[匹配规则6]

  • “http://dev.zdp.com/hello/yaz” ——- 正则匹配,命中[匹配规则5]

  • “http://dev.zdp.com/hello/yAZ3” ——- 正则匹配,按照location顺序匹配,命中[匹配规则3]

  • “http://dev.zdp.com/hello/no” ——- 通用匹配,按照匹配长度优先,命中[匹配规则2]

  • “http://dev.zdp.com/hello/Ok” ——- 通用匹配,命中[匹配规则1]

  • “http://dev.zdp.com/everyone” ——- 通用匹配,所有其它匹配不满足时,命中[匹配规则0]

nginx中rewrite命令如何重写url?

rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{}中,并且只能对域名后边的除去传递的参数外的字符串起作用,例如:

http://dev.zdp.com/a/we/index.php?id=1&u=str => rewrite只能对/a/we/index.php部分重写


  1. server {

  2. rewrite 规则 定向路径 重写flag;

  3. }

  4.  
  5. location {

  6. rewrite 规则 定向路径 重写flag;

  7. }

rewrite的执行顺序

执行server块的rewrite指令;执行location匹配;执行选定的location中的rewrite指令,如果location中rewrite指令没有break的flag,则会根据当前rewrite路径重新匹配location;如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件,循环最多不会超过10次;

rewrite的flag标志

last: 停止处理当前location中的ngxhttprewritemodule指令集(rewrite,return等),并开始重新搜索与更改后的URI相匹配的locationbreak : 停止处理当前location中的ngxhttprewritemodule指令集(rewrite,return等),不会重新搜索redirect : 返回302临时重定向,地址栏会显示跳转后的地址permanent : 返回301永久重定向,地址栏会显示跳转后的地址default: 默认标志,继续会处理当前location中的ngxhttprewrite_module指令集(rewrite,return等),如果没有return,会开始重新搜索与更改后的URI相匹配的location

nginx中if判断如何使用?

只是上面的简单重写很多时候满足不了需求,比如需要判断当文件不存在时、当路径包含xx时等条件,则需要用到if

Nginx中if语法为:if(condition){…},对给定的条件condition进行判断。如果为真,大括号内命令将被执行

if判断规则

  • 当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false

  • 直接比较变量和内容时,使用=或!=

  • ~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的正则表达式不匹配,满足条件返回true

  • -f和!-f用来判断是否存在文件

  • -d和!-d用来判断是否存在目录

  • -e和!-e用来判断是否存在文件或目录

  • -x和!-x用来判断文件是否可执行

if使用举例

if条件中一般会使用到一些变量,这些变量有些是用户定义的,有些是系统本身存在的,关于变量相关内容请看下文[Nginx中如何使用变量?]


  1. server {

  2. if ($http_user_agent ~ MSIE) {

  3. rewrite ^(.*)$ /msie/$1 break;

  4. }

  5. # 如果UA包含"MSIE",rewrite请求到/msid/目录下

  6.  
  7. if ($http_cookie ~* "id=([^;]+)(?:;|$)") {

  8. set $id $1;

  9. }

  10. # 如果cookie匹配正则,设置变量$id等于正则引用部分

  11.  
  12. if ($request_method = POST) {

  13. return 405;

  14. }

  15. # 如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302

  16.  
  17. if ($slow) {

  18. limit_rate 10k;

  19. }

  20. # 限速,$slow可以通过 set 指令设置

  21.  
  22. if (!-f $request_filename){

  23. break;

  24. proxy_pass http://127.0.0.1;

  25. }

  26. # 如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查

  27.  
  28. if ($args ~ post=140){

  29. rewrite ^ http://example.com/ permanent;

  30. }

  31. # 如果query string中包含"post=140",永久重定向到example.com

  32.  
  33. location ~* .(gif|jpg|png|swf|flv)$ {

  34. valid_referers none blocked www.jefflei.com www.leizhenfang.com;

  35. if ($invalid_referer) {

  36. return 404;

  37. }

  38. # 防盗链

  39. }

  40. }

nginx变量如何使用?

Nginx也可以使用变量,变量分为系统变量和自定义变量

变量特点

  • Nginx变量的创建只能发生在Nginx配置加载的时候,或者说Nginx启动的时候;

  • Nginx变量的赋值操作则只会发生在请求实际处理的时候;

  • 每个请求都有所有变量的独立副本,或者说都有各变量用来存放值的容器的独立副本,它们之间的值彼此互不干扰;

自定义变量

自定义变量通过set命令初始化和赋值,变量名前需要加$符号作为区分


  1. # 设置变量$a = "helloworld";

  2. set $a hello world;

  3.  
  4. # 设置变量$b = "helloworld, helloworld";

  5. set $b "$a, $a";

nginx中一些常用的命令

  • nginx -t 检查配置是否可用

  • nginx -s reload 重启nginx

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!