Nginx

Linux下安装JDK,Mysql,Ngnix-CSDN博客

基础篇:

1 nginx核心概念

1.1 最小配置文件

nginx.conf去掉注释后的最小配置文件

worker_processes  1; #启动的worker进程数,建议与CPU核心数保持一致,(双核4线程,可以设置为4)

events {
    worker_connections  1024; #单个工作进程(worker)可以允许同时建立外部连接的数量
}

http {
    include       mime.types; #引入mime.types配置,mime.types是服务器返回给浏览器的类型,告诉浏览器以哪种格式展示
    default_type  application/octet-stream; #默认的返回类型
 
    sendfile        on; #开启零拷贝
	keepalive_timeout  65;  #用来设置长连接的超时时间

#虚拟主机 vhost
    server {
        listen       80; #监听的端口号
        server_name  localhost; #域名、主机名
# url:http://ayguigu.com/order/queryOne
# uri:域名之后的东西 /order/queryOne
# location匹配的就是uri,一个主机下可以配置多个location且互不影响
        location / {
            root   html; #匹配到该location后从哪个目录来找网页。html是相对路径,相对于nginx的主目录,相当于/usr/local/nginx/html
            index  index.html index.htm;  #如果没有默认页,访问到这个目录下如果有这两个文件就展示出来
        }
       # 当访问url出现500 502 503 504错误时,重定向到/50x.html,即是http://ayguigu.com/50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html { #当访问/50x.html时,就到相对路径html下找,即是html下的50x.html
            root   html;
        }
    }
}

1.2 虚拟主机

        
        虚拟主机,就是把一台物理服务器划分成多个虚拟的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。Nginx 提供虚拟主机的功能,就是为了让我们不需要安装多个 Nginx,就可以运行多个域名不同的网站。

Nginx 下,一个 server 标签就是一个虚拟主机。nginx 的虚拟主机就是通过 nginx.conf 中 server 节点指定的,想要设置多个虚拟主机,配置多个server节点即可。

如果一个公司有多个二级域名,没有必要为每个二级域名都提供一台 Nginx 服务器,就可以使用虚拟主机技术,在一台 Nginx 服务器上,模拟多个虚拟服务器。

配置虚拟主机方式:
1)基于端口的虚拟主机
使用端口来区分。浏览器使用同一个域名 + 端口或同一个ip地址 + 端口访问;

2)基于域名的虚拟主机
使用域名来区分。端口可以相同,但是域名+端口不能相同。

实操:
修改本地的hosts文件,文件位置:C:\Windows\System32\drivers\etc\hosts 将云服务器ip和nginxtest.com域名、nginxstudy.com域名绑定。进入home目录下,分别创建hello和world文件夹,在其下分别创建index.html

1.2.1 端口区分:

server {
        listen       80;
        server_name  nginxtest.com;

        location / {
            root   /home/hello;
            index  index.html index.htm;
        }
    }
server {
        listen       81;
        server_name  nginxtest.com;

        location / {
            root   /home/world;
            index  index.html index.htm;
        }
    }

./nginx -s reload 重新加载nginx配置

浏览器访问http://nginxtest.com/,显示/home/hello/index.html中的内容。不带端口的默认就是80端口。
浏览器访问http://nginxtest.com:81/,显示/home/world/index.html中的内容。

2.2.2 域名区分

server {
        listen       80;
        server_name  nginxtest.com;

        location / {
            root   /home/hello;
            index  index.html index.htm;
        }
    }
server {
        listen       80;
        server_name  nginxstudy.com;

        location / {
            root   /home/world;
            index  index.html index.htm;
        }
    }

./nginx -s reload 重新加载nginx配置

浏览器访问http://nginxtest.com/,显示/home/hello/index.html中的内容。
浏览器访问http://nginxstudy.com/,显示/home/world/index.html中的内容

1.3 域名解析


1.3.1 公网DNS服务器与内网DNS服务器的应用场景


公网DNS服务器:
1)使用场景:用户通过公网访问网站:www.qq.com
2) 谁搭建?电信/联通/移动+域名服务提供商(如万网)+自建公网DNS服务器(大公司才自建)

内网DNS服务器:
1)给DB加一个内网域名,应用服务器通过域名访问DB
2) 谁搭建?公司运维,可以用Linux Bind,dnsmasq

域名解析就是将域名解析为ip地址的过程。寻找资源主要还是靠的是IP地址,但是ip地址不方便人们记忆,便又发明了域名方便记忆,通过域名来访问ip地址。

1.3.2 浏览器域名解析过程


DNS域名解析,在客户端和浏览器,本地DNS之间是递归查询,在本地DNS服务器与根域及其子域之间是迭代查询。

迭代查找与递归查找的区别:
递归:A问B,B不知道,B去问C,然后把结果返回给A
迭代: A问B,B不知道,B说C知道,A自己去问C

递归查询:
查找浏览器缓存 ----> 查找操作系统缓存(hosts) ----> 查找路由器缓存 ----> 查找本地DNS缓存 ----> 本地DNS服务器

本地DNS服务器找不到:根据本地DNS服务器设置的转发器进行迭代查找。本地DNS服务器也有缓存,不会每一次解析都去迭代查找。对于国内而言,本地DNS服务器就是电信/联通/移动提供的一个远程DNS客户端,由它去迭代查询 根–>一级—>二级—>三级

本地DNS服务器请求根域名服务器,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步应该向哪一个顶级域名服务器进行查询。国际顶级域名服务器,包含.com、.cn、.org等后缀域名解析,所有提供域名注册的注册商必须在此DNS服务器中注册。

本地DNS服务器请求顶级域名服务器,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步应该向哪一个权限域名服务器进行查询。

本地DNS服务器请求权限域名服务器,给出所要查询的IP地址。本地DNS服务器把这个结果返回给发起查询的客户机。

广域网负载均衡(GSLB)
广域网负载均衡:大厂自己研发的DNS服务器。最终实现:一个域名对应多个ip,网站在全国各地部署,用户就近访问。

授权DNS服务器
授权DNS服务器:是一级一级授权的,根是由国际组织(注册局)去管理的,由它去管控所有的一级域名服务器的申请,将一级域名的管理授权给了全球各地的注册商,中国授权给了万网。注册商将下面的二级、三级、四级域名的解析授权给各个企业,这样企业就可以自建DNS域名服务器了,然后加入到全球的网络。
注册局–>注册商–>企业自建DNS服务器 层层授权,所以叫授权DNS服务器

DNS劫持
本地DNS大多数为运营商DNS服务器,处在整个DNS解析的交互的中心,这里容易发生劫持。如你访问www.qq.com,却返回了其他访问的ip地址。

httpDNS
游览器会向你部署httpDNS服务器发送HTTP请求(直接访问httpDNS的IP),HTTP服务器返回域名解析结果,然后浏览器缓存起来。相当于绕过了本地DNS,直接去请求httpDNS,所以就不存在DNS劫持了。
httpDNS适合app、或CS架构的服务,通过预埋ip地址,直接将域名解析发到httpDNS所在服务器。

Short URL
短网址,Short URL、短URL,是指短网址服务器为某个链接生成的中间链接。短链接并不是绝对的就比原链接短。短网址可以减少字节数,同时还可以隐藏真实网站地址。短网址机制根本上是通过“短网址服务器+302重定向实现”。本质就只是将短网址还原为原网址,可以将短网址与原网址建立一个映射。所以点击短网址必须是去访问短域名服务器而不是原URL的服务器。

泛域名解析
域名泛解析最大的用途是可以让主域名支持无限的子域名扩展。
泛域名解析:*.域名解析到同一IP。
域名解析:子域名.域名解析到同一IP。

泛域名解析可以用来做多用户二级域名。

1.3.3 server_name匹配规则


servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。

完整匹配
我们可以在同一servername中匹配多个域名
server_name vod.mmban.com www1.mmban.com;

通配符匹配
server_name *.mmban.com

通配符结束匹配
server_name vod.*;

正则匹配

server_name ~^[0-9]+\.mmban\.com$;

2 反向代理

一图区分正向代理与反向代理

正向代理
用户和外网不能互通,通过代理服务器将用户请求发送给外网

反向代理
用户和nginx是互通的,用户和应用服务器是不互通的,用户发送请求到nginx,nginx作为代理将请求发送给应用服务器(如tomcat等),tomcat接受nginx的请求处理好后将结果发送给nginx,nginx将结果发送给用户。
如下图,是隧道式代理(瓶颈在于nginx代理服务器,即使应用服务器的带宽很大,但是如果代理服务器的带宽很小,那么请求都会阻塞到代理服务器)


反向代理和正向代理的区别是代理服务器的提供方不同,对于反向代理,nginx是由服务提供方提供的,对于正向代理,代理服务器是由用户自己提供的

如何解决隧道式代理的问题呢?
DR模型:
用户发送请求到代理服务器,代理服务器正常将请求发送给应用服务器,在应用服务器处理完请求后直接将结果发送给用户,不经过代理服务器。LVS负载均衡器既可以使用DR模型,也可以使用隧道式代理模型

反向代理实际配置
proxy_pass http://baidu.com;
配置了proxy_pass以后,就可以注释掉root 和html,然后访问nginxtest.com,就会被反向代理到http://www.baidu.com/

server {
        listen       80;
        server_name  nginxtest.com;
        location / {
             proxy_pass http://www.baidu.com/;
    #        root   /home/hello;
     #       index  index.html index.htm;
        }
    }

如果nginx作为反向代理使用,那么必须要搞明白的就是proxy_pass的规则,这关系到请求能否打到正确的接口。
proxy_pass规则:

如果proxy_pass后面没有路径,那么转发时带上uri
如果proxy_pass后面有路径,那么转发时使用该路径替换匹配到的uri

2.1 负载均衡


2.1.1 基本概念
如果一个服务由多台服务器提供,需要把负载分配到不同的服务器处理,需要负载均衡。负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。
upstream tomcat2 {
server 192.168.25.148:8081;
server 192.168.25.148:8082;
}
默认的负载均衡的策略就是轮询的方式。

可以根据服务器的实际情况调整服务器权重。权重越高分配的请求越多,权重越低,请求越少。默认是都是1

负载均衡策略
轮询:默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求。
weight(权重):指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream httpd
{
server 127.0.0.1:8050 weight=10 down;
server 127.0.0.1:8060 weight=1;
server 127.0.0.1:8060 weight=1 backup;
}
down:表示当前的server暂时不参与负载
weight:默认为1.weight越大,负载的权重就越大。
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。

ip_hash:根据客户端的ip地址转发同一台服务器,可以保持会话。但是如果是动态ip,其实也不能保持会话。
least_conn:最少连接访问(可能造成流量倾斜)
url_hash:根据用户访问的url定向转发请求(第三方插件)
fair:根据后端服务器响应时间转发请求(可能造成流量倾斜)(第三方插件)

2.1.2 负载均衡的配置
因为只有一台服务器,所以使用虚拟主机来做负载均衡,采用端口区分的方式。

编辑nginx.conf时xshell连接出现异常退出,再次进入vim编辑模式一直提示如下:
Swap file “.nginx.conf.swp“ already exists!

在使用vim编辑某文件的时候,会产生一个swp文件 .FILENAME.swp

rm .nginx.conf.swp 删除该文件即可

重新加载配置文件时出现如下报错

cat -n nginx.conf 查看nginx.conf文件并输出行号

通过对比老师课件,发现少了http://

nginx: [emerg] unexpected “}” in /usr/local/nginx/conf/nginx.conf:67
多了一个},vim 模式,dd删除改行,保存退出

1)轮询

upstream httpProxy {
	server 10.0.4.23:81;
	server 10.0.4.23:82;
  }
    server {
        listen       80;
        server_name  nginxtest.com;
        location / {
             proxy_pass http://httpProxy;
    #        root   /home/hello;
     #       index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
server {
        listen       81;
        server_name  nginxstudy.com;
        location / {
             proxy_pass http://www.qq.com/;
             root   /home/world;
             index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
server {
        listen       82;
        server_name  nginxlearn.com;
        location / {
             proxy_pass http://www.baidu.com/;
             root   /home/leihou;
             index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

测试:在浏览器输入nginxtest.com,被反向代理到http://httpProxy,因为upstream 对httpProxy做了负载均衡,所以会被代理到10.0.4.23的81和82端口。而81和82端口又被server 监听了,所以会反向代理到http://www.qq.com/和http://www.baidu.com/,最终结果就是浏览器轮询访问qq和百度,反向代理负载均衡虚拟主机配置成功!!!

注释掉81和82中的反向代理proxy_pass配置,在浏览器访问nginxtest.com,地址栏不变,会轮询访问/home/world和/home/leihou下面的index.html

2)权重

upstream httpProxy {
	server 10.0.4.23:81  weight=5;
	server 10.0.4.23:82  weight=1;
  }

81和82以近似5比1的比例访问。

3)dome

upstream httpProxy {
	server 10.0.4.23:81  weight=5 down;
	server 10.0.4.23:82  weight=1;
  }

加入dome,就不参与了

4)backup

upstream httpProxy {
	server 10.0.4.23:81  weight=5;
	server 10.0.4.23:82  weight=1 backup;
  }

备用服务器,当其他都不参与的时候参与

不常用:

2.2 动静分离

动静分离:严格意义是将动态请求和静态请求分离。

一种是将静态文件拆分出来,放置在独立域名下的服务器(主流方案)。另一种是混合在一起,使用nginx区分。通过location 指定不同的后缀名实现不同的请求转发。

配置反向代理

location / { 
proxy_pass http://10.0.4.23:8080; 
#root html; 
#index index.html index.htm; 
}

增加每一个location

location /css { 
root /usr/local/nginx/static; 
index index.html index.htm; 
} 
location /images { 
root /usr/local/nginx/static; 
index index.html index.htm; 
} 
location /js { 
root /usr/local/nginx/static; 
index index.html index.htm; 
}

使用一个location
location = /uri 精确匹配
location ^~ /uri 前缀匹配,在正则匹配之前
location ~ pattern 正则匹配,区分大小写
location ~* pattern 正则匹配,不区分大小写
location /uri 前缀匹配,在正则匹配之后
location / 通用匹配,未匹配到其它location的请求会匹配到它

location匹配顺序
多个正则location直接按书写顺序匹配,成功后就不会继续往后面匹配
普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
所有类型location存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)

location ~*/(css|img|js) 
{ 
root /usr/local/nginx/static; 
index index.html index.htm; 
}

location 配置实例

upstream webserver_v1 { 
        server 10.1.75.62;

}
upstream webserver_v2 { 
server 10.1.75.63;
}

location / {
	   proxy_ignore_client_abort on;
	   proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
	   proxy_set_header    X-Real-IP $remote_addr;
	   proxy_set_header    Host $http_host;	#把请求的主机域名传到后端   
	   proxy_set_header X-Http-scheme $scheme;

     set $group webserver_v1 ; #默认为生产环境
	   if ($http_cookie ~* "environment=gray") {
       		set $group webserver_v2; #有Cookie去灰度环境
	   }
	   proxy_pass http://$group;
	   proxy_connect_timeout 300s;
	   proxy_read_timeout 3000s;
       proxy_send_timeout 3000s;
	   break;
       }

alias与root

location /css 
{ alias /usr/local/nginx/static/css; 
index index.html index.htm; 
} 

root用来设置根目录,而alias在接受请求的时候在路径上不会加上location。
1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的;
2)root指定的目录是location匹配访问的path目录的上一级目录,这个path目录一定要是真实存在root指定目录下的;
3)使用alias标签的目录块中不能使用rewrite的break(具体原因不明);另外,alias指定的目录后面必须要加上"/“符号!!
4)alias虚拟目录配置中,location匹配的path目录如果后面不带”/“,那么访问的url地址中这个path目录后面加不加”/“不影响访问,访问时它会自动加上”/“; 但是如果location匹配的path目录后面加上”/“,那么访问的url地址中这个path目录必须要加上”/“,访问时它不会自动加上”/“。如果不加上”/“,访问就会失败!
5)root目录配置中,location匹配的path目录后面带不带”/",都不会影响访问。

动静分离实操
将静态文件存放到nginx服务器上,目录为/home/static,分别上传1.jpg和2.jpg
在server监听80端口下配置如下内容。

location /images { 
    	          # alias /home/static;
    	            root /home/static; 
    	           index index.html index.htm; 
    	        }


alias就是直接访问static下面的内容,root就是访问/static/images下的内容

测试
浏览器访问:http://nginxtest.com/images/1.jpg,其实访问的是/home/static/images下的1.jpg,图片正常显示。

2.3UrlRewrite


rewrite语法格式及参数语法: rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容, 重定向到replacement,结尾是flag标记。
rewrite [flag];
关键字 正则 替代内容 flag标记

关键字:其中关键字error_log不能改变
正则:perl兼容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement
flag标记:rewrite支持的flag标记
rewrite参数的标签段位置: server,location,if

flag标记说明:
last         #本条规则匹配完成后,继续向下匹配新的location URI规则
break        #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect           #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent        #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
redirect 和 permanent 对用户来说,感觉是一样的。

实例1
rewrite ^/([0-9]+).html$      /index.jsp?pageNum=$1   break;

网关配置
upstream httpds
{ server 192.168.44.102 weight=8 down;
server 192.168.44.103:8080 weight=2;
server 192.168.44.104:8080 weight=1 backup; }
location /
{ rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 redirect;
proxy_pass http://httpds ; }

实例2
rewrite ^/(.*) http://www.baidu.com/$1 permanent;

rewrite 是固定关键字,表示开始进行rewrite匹配规则。
regex 是 ^/(.*),这是一个正则表达式,匹配完整的域名和后面的路径地址。
replacement 是 http://www.baidu.com/$1,其中$1是取regex部分()里面的内容,如果匹配成功后跳转到的URL
flag 是 permanent,代表永久重定向的含义,即跳转到 http://www.baidu.com/$1

Nginx直接返回假的响应

location /test/study/queryIso2List{
default_type application/json;
return 200 '{"streamNo": "123456789","code": "00000000","msg": "success","data": {    "iso2List": [ "CN", "JP"]}}';
 }

2.1  2.2   2.3                       网关服务器

2.4 防盗链配置


valid_referers none | blocked | server_names | strings …;

valid_referers none 192.168.200.200;


none, 检测 Referer 头域不存在的情况。
blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以“http://” 或 “https://” 开头。
server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。
在需要防盗链的location中配置
valid_referers 192.168.44.101; # 允许的ip
if ($invalid_referer) # 如果不被允许
{ return 403; }# 返回错误码403

curl查看状态码:

yum install -y curl

使用curl测试 -I 参数则只显示 http response 的头信息。
curl -I http://10.0.4.23/images/1.jpg

带引用 -e 带引用
curl -e “http://baidu.com” -I http://10.0.4.23/images/1.jpg

实操配置

返回错误码:

valid_referers 192.168.200.200;
           if ($invalid_referer)
           { 
                return 403; 
            }


返回错误页面:
error_page不能少,否则匹配不上。在html下 cp 50x.html 401.html,修改内容

valid_referers 10.0.4.23;
           if ($invalid_referer)
           { return 401; }

error_page   401  /401.html;
        location = /401.html {
            root   html;
        }


返回图片:
首先确保rewrite 后地址可以正常访问

valid_referers 10.0.4.23;
           if ($invalid_referer)
            { rewrite ^/ http://nginxtest.com/image/1.gif break; }

 3.高可用配置

        3.1高可用场景及解决方案

高可用是指2台机器启动着完全相同的业务系统,一台机器宕机后,另一台可以快速启用,用户是无感知的。高可用硬件通常使用F5,软件通常使用keepalived。keepalived软件是基于VRRP协议实现的,VRRP虚拟路由冗余协议,主要用于解决单点故障

        3.2安装keepalived

yum install keepalived

 文件在:vi /etc/keepalived/keepalived.conf 

【运维知识进阶篇】集群架构-Nginx高可用Keepalived_keepalived nginx集群-CSDN博客

4. CA安全协议

        

https://blog.csdn.net/learning_xzj/category_11792194.htmlicon-default.png?t=N7T8https://blog.csdn.net/learning_xzj/category_11792194.html

高级篇:

  • 24
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆浆-plus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值