Nginx基础

2019/06/22 分布式

Nginx基础

1.作用

读取静态文件;

反向代理:

location /xxx {
	proxy_pass http://172.17.0.1:8081/
}

负载均衡:

upstream xxx {
	server 172.17.0.1:8081;
	server 172.17.0.2:8081;
}

2.工作流程

Nginx服务启动后,会有两个进程,master进程和worker进程。

master进程:接收外界信号,向各个worker进程发送信号,监控worker进程的运行状态,当worker进程退出后,会自动重新启动新的worker进程;

worker进程:进行主要的工作流程。

3.conf文件

nginx.conf文件是Nginx最重要的配置文件,下面是其中一些比较重要的配置项。

3.1 location匹配规则

location [=|~|~*|^~|无] /uri/ {...}

location支持5种匹配规则:

  • 精准匹配:”=”表示;
  • 普通匹配:无前缀和”^~”表示,”^~”指不使用正则,如果有正则匹配到,不会被覆盖;
  • 正则匹配:”~”和”~*“,”~ *“指不区分大小写,正则匹配如果有一个匹配到,后续的流程就不再继续。

3.2 location代理配置

location中可以进行静态文件代理和动态的转发代理。

  • 动态代理:

    proxy_pass路径后是否有/,表示不同的含义,有/,表示此处关闭,只传递匹配目录后的路径到目标地址;没有/,表示此处未关闭,传递整个路径。

    • 有/,访问路径:http://process.enjoy.com/dynamic/enjoy/getInfo,最终查询的路径为enjoy/getInfo;

      location /dynamic {
      	proxy_pass http://172.17.0.1:8081/
      }
      
    • 无/,访问路径:http://process.enjoy.com/enjoy/getInfo,最终查询的路径为enjoy/getInfo;

      location /enjoy {
      	proxy_pass http://172.17.0.1:8081;
      }
      
    • 如果端口号之后还有path,则相当于已经关闭了,目录后加/与不加没有区别

      这两种是相同的效果,都是已经关闭的流程

      location /enjoy {
      	proxy_pass http://172.17.0.1:8081/info;
      	proxy_pass http://172.17.0.1:8081/info/;
      }
      
  • 静态代理

    代理静态文件有两种方式rootalias,是属于声明,不是命令,相当于预置一个路径,默认值为Nginx安装的根目录

    • root表示指定一个根目录,然后在该根目录下寻找请求地址中的文件;

      访问路径:http://process.enjoy.com/static/a.html,最终查询的路径为html/static/a.html

      location /static {
      	root html/;
      }
      
    • alias表示指定一个别名,将匹配中的一段path替换为alias后指定的路径,然后在这个路径下去寻找文件。

      访问路径:http://process.enjoy.com/target/a.html,最终查询的路径为html/static/a.html;

      location /target {
      	alias html/static/;
      }
      

3.3 rewrite命令

rewrite命令用来重定向。

rewrite regex replacement [flag];
flag=[break|last|redirect|permanent|空]
  • redirect permanent:页面重定向,浏览器中的路径改变;
  • break last:内部重定向,path路径改变;

    如果没有匹配成功,last会引发location重新匹配,break直接中断。

    访问路径:http://process.enjoy.com/aa.html

    • break指令,如果匹配成功,执行html/static/a.html文件,如果匹配失败,执行html/static/aa.html文件:

      location /aa.html {
      	rewrite ^/ /a.html break;
      	root html/static/;
      }
      
    • last指令,如果匹配失败,引发location重新匹配,打印出aaa

      location /a.html {
      	echo "aaa";
      }
          
      location /aa.html {
      	rewrite ^/ /a.html last;
      	rewrite ^/ /b.html last; ##不会执行到
      	root html/static/;
      }
      
  • 没有flag时,rewrite会继续往下走,最后一个rewrite覆盖前面的,再引发location重新匹配,打印出bbb

    location /a.html {
    	echo "aaa";
    }
      
    location /b.html {
    	echo "bbb";
    }
      
    location /aa.html {
    	rewrite ^/ /a.html;
    	rewrite ^/ /b.html; ##最终执行到这个,并重新匹配到/b.html
    	root html/static/;
    }
    

3.4 index指令

rootalias指令内,会指定index指令,它的执行时机如下:

  • url以/结尾时,Nginx认为是目录,没有指定文件,读取index指定的文件;
  • 没有以/结尾时,Nginx认为是文件,会尝试打开这个文件,此时index不启用

查找文件时,与rootalias指定的目录无关,以浏览器中请求的path为主去查找文件。

3.5 if指令

表达式 含义
=,!= 比较的一个变量和字符串。
~, ~* 与正则表达式匹配的变量,如果这个正则表达式中包含
-f,!-f 检查一个文件是否存在
-d,!-d 检查一个目录是否存在
-e,!-e 检查一个文件、目录、符号链接是否存在
-x,!-x 检查一个文件是否可执行

eg:

  • 浏览器校验:

    if ($http_user_agent ~ Firefox)
    

4.其他问题

4.1 内置变量

变量 含义
$host 请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的server名称
$http_HEADER HTTP请求头中的内容,HEADER为HTTP请求中的内容转为小写,-变为_(破折号变为下划线),例如:$http_user_agent(Uaer-Agent的值)
$remote_addr 客户端的IP地址
$remote_port 客户端的端口
$request_method 这个变量是客户端请求的动作,通常为GET或POST
$request_uri 这个变量等于包含一些客户端请求参数的原始URI
$scheme 所用的协议,比如http或者是https
$server_name 服务器名称
$server_port 请求到达服务器的端口号
$server_protocol 请求使用的协议,通常是HTTP/1.0或HTTP/1.1
$uri 请求中的当前URI(不带请求参数,参数位于$args)

4.2 跨域问题

根据域名访问A服务器,A服务器返回的内容又访问B服务器,B服务器访问资源拒绝执行。

  • jsonp解决方案:

    document.domain+Iframe跨域

  • Cors解决方案:

    添加header头Access-Control-Allow-Origin,表明允许网站执行。

    携带来源网址的Request HeadersOrigin,表示要跨域的地址;

    经过Nginx后返回的响应Response HeadersAccess-Control-Allow-Origin,表示运行该地址跨域。

    Nginx配置文件中添加如下配置:

    if($http_origin ~ http://xxxx) {
    	set $allow_url $http_origin
    }
      
    add_header Access-Contril-Allow-Origin $allow_url;
    

4.3 防盗链

让资源只能在自己的页面内展示,不允许单独获取,不能防止爬虫

location ^~ /xxx {
	#允许xxxx地址访问
	valid_referers xxxx; 
	#不允许的返回404
	if($invalid_referer){
		return 404;
	}
}

4.4 缓存

location ^~ /xxx {
	expires 2s;
}

4.5 压缩

Nginx压缩,浏览器解压,一般不压缩image文件,解压缩浪费带宽

Request Header

Accept-Encoding:gzip #表示允许gzip压缩格式的解压

Response Header

Content-Encoding:gzip#Nginx使用gzip进行压缩

Nginx配置文件中添加如下配置:

location ~ /(.*)\.(html|js|css|jpg|png|gif)$ {
	gzip types application/javascript test/css image/jpg image/png image/gif;
	gzip on;
}

4.6 HTTPS

nginx端配置一个私钥,当浏览器请求过来时,返回一个SSL证书给浏览器,SSL证书中包含经过RSA算法加密的公钥,然后使用公钥对请求的内容加密,发送到Nginx服务器,之后Nginx进行转发。

Nginx中需要配置两个文件:

  • 一个key,私钥,放在Nginx服务器里面,仅一份

  • 一个证书,里面最重要的是公钥,供浏览器下载

4.7 keepalived

一般不用,使用一个域名绑定多个ip的方式来实现高可用。

lvs思想(虚拟ip):每个Nginx服务器配置一个keepalived服务,每台服务器的keepalived共同生成一个虚拟网关,这个虚拟网关指向任意一台Nginx服务器,达到高可用的目的。

Search

    Table of Contents