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/; }
-
-
静态代理
代理静态文件有两种方式
root
和alias
,是属于声明,不是命令,相当于预置一个路径,默认值为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指令
root
和alias
指令内,会指定index
指令,它的执行时机如下:
- url以/结尾时,Nginx认为是目录,没有指定文件,读取
index
指定的文件; - 没有以/结尾时,Nginx认为是文件,会尝试打开这个文件,此时
index
不启用。
查找文件时,与root
和alias
指定的目录无关,以浏览器中请求的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 Headers中Origin,表示要跨域的地址;
经过Nginx后返回的响应Response Headers中Access-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服务器,达到高可用的目的。