Nginx介绍
Nginx 是高性能的HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。有以下四个版本:
-
Nginx开源版 http://nginx.org/en/ 官方原始的Nginx版本
-
Nginx plus商业版 :开箱即用,集成了大量功能
-
Open Resty https://openresty.org/cn/ OpenResty是一个基于Nginx与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。更适用于需要大量二次开发的场景,有极强的扩展性
-
Tengine https://tengine.taobao.org/
由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝,天猫等得到了很好的检验。相比于Open Resty,扩展性不够强,但是能够满足绝多数使用场景
Nginx安装
CentOS7虚拟机下安装Nginx_草莓摇摇奶昔-的博客-CSDN博客
Nginx 目录
conf #配置文件
|-nginx.conf # 主配置文件
|-其他配置文件,都被引入到了nginx.conf
html #静态页面
logs
|-access.log #访问日志(每次访问都会记录)
|-error.log #错误日志
|-nginx.pid #进程号
sbin
|-nginx #主进程文件
*_temp #运行时,生成临时文件
Nginx配置
后面学习Nginx配置,每次修改配置文件,一定要重载才能生效
systemctl reload nginx
Nginx的配置文件主要有三部分组成:全局块,events块,http块
全局块:从配置文件开始到 events 之间的内容,主要会设置一些会影响 nginx 服务整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 work_process(工作进程)数、进程 pid 存放路径、日志类型和存放路径、配置文件的引入等。
worker_processes 1; # 启动的worker进程数
这是 Nginx 服务器并发处理服务的关键配置, work_process 值越大。可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
events块:events块涉及的指令主要影响 Nginx 服务器与用户之间的网络连接,常用的设置包括是否开启对 work_process 下的网络连接序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work_process 可以同时支持的最大连接数。比如:
events {
worker_connections 1024; #每个worker进程的连接数
}
表示每个work_process支持的最大连接数为1024
http块:这是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志等绝大多数功能和第三模块的配置都在这里。http块也可以包括http全局块、server块。
http全局块:http全局块的配置的指令中包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、但连接请求数上限等。
http server块:这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是一样的。该技术的产生是为了节省互联网服务器硬件成本。每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机。
每个server块包含全局server块和多个location块。
全局server块:最常见的配置是本虚拟主机的监听配置和本虚拟主机的名称或IP配置。
location块:一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
http {
include mime.types; #include是引入关键字,这里引入了mime.types这个配置文件(同在conf目录下,mime.types是用来定义,请求返回的content-type)
default_type application/octet-stream; #mime.types未定义的,使用默认格式application/octet-stream
sendfile on; #是否启用sendfile技术,参见 0 拷贝技术
keepalive_timeout 65; #长链接超时时间
#一个nginx可以启用多个server(虚拟服务器)
server {
listen 80;#监听端口80
server_name localhost; #接收的域名
location / {
root html; #根目录指向html目录
index index.html index.htm; #域名/index 指向 index.html index.htm文件
}
error_page 500 502 503 504 /50x.html; # 服务器错误码为500 502 503 504,转到"域名/50x.html"
location = /50x.html {# 指定到html文件夹下找/50x.htm
root html;
}
}
}
反向代理与负载均衡
反向代理:其客户端对代理是无感的,因为客户端不需要任何配置就能访问。我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的 IP 地址。这种代理方式叫做,隧道代理。有性能瓶颈,因为所有的数据都经过Nginx,所以Nginx服务器的性能至关重要。
负载均衡:由于访问量和数据量的飞速增长,以及系统业务的复杂度增加,服务器响应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃,因为单个服务器解决不了这种问题,因此我们需要增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器。简而言之,负载均衡就是把请求按照一定算法规则,分配给多台业务服务器(即使其中一个坏了/维护升级,还有其他服务器可以继续提供服务)。
反向代理实现方法
启用proxy_pass,此时 root 和 index 字段就会失效
proxy_pass 后的地址必须写完整(否则会跳302重定向) http://xxx
,不支持https
当访问localhost时(Nginx服务器),网页打开的是http://xxx
(应用服务器),网页地址栏写的还是localhost
http{
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://xxx;
#root html/test;
#index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
负载均衡实现方式:
使用upstream定义一组地址【在server字段下】
访问localhost,访问都会代理到192.168.44.100:80
和192.168.44.200:80
这两个地址之一,每次访问这两个地址轮着切换(后面讲到,因为默认权重相等)
http{
upstream httpds{
server 192.168.44.100:80; #如果是80端口,可以省略不写
server 192.168.44.200:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://httpds;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
设置权重
upstream httpds{
server 192.168.174.133:80 weight = 10; #如果是80端口,可以省略不写
server 192.168.174.134:80 weight = 80;
}
关闭
upstream httpds{
server 192.168.174.133:80 weight = 10 down; #如果是80端口,可以省略不写
server 192.168.174.134:80 weight = 80;
}
备用机
如果192.168.44.100:80
出现故障,无法提供服务,就用使用backup的这个机器
upstream httpds{
server 192.168.174.133:80 weight = 10; #如果是80端口,可以省略不写
server 192.168.174.134:80 weight = 80 backup;
}
动静分离
以前单个服务器存放动态资源和静态资源,反向代理服务器(Nginx)为了响应客户端请求,需要到服务器中同时查找动态资源和静态资源并返回给客户端,解析速度太慢,为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。例如:当用户请求时,动态请求分配到Tomcat业务服务器,静态资源请求放在Nginx服务器中
-
如果请求的资源地址是
location/
,/
的优先级比较低,如果下面的location没匹配到,就会走http://xxx这个地址的机器 -
如果请求的资源地址是
location/css/*
,就会被匹配到nginx的html目录下的css文件夹中(我们把css静态资源放在这个位置)
server {
listen 80;
server_name localhost;
location / { # /的优先级比较低,如果下面的location没匹配到,就会走http://xxx这个地址的机器
proxy_pass http://xxx;
}
location /css { # root指的是html,location/css指的是root下的css,所以地址就是html/css
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
使用正则
location ~*/(js|css|img){
root html;
index index.html index.htm;
}
URL重写
rewrite是URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尼是flag标记。
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flagt标记
正则:正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement
flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的1ocation URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临重定向,游览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,测览器地址栏会显示跳转后的URL地址
浏览器地址栏访问 xxx/123.html
实际上是访问xxx/index.jsp?pageNum=123
server {
listen 80;
server_name localhost;
location / {
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
proxy_pass http://xxx;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
网关服务器
图中,Tomcat 应用服务器不能直接被外网访问到,只能通过Nginx服务器进行访问(使用proxy_pass反向代理的方式),这时候这台Nginx服务器就成为了网关服务器(承担入口的功能)
所以,我们启动应用服务器的防火墙,设置其只能接受这台Nginx服务器的请求
添加rich规则
#这里的192.168.174.135是网关 服务器地址
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.44.100" port protocol="tcp" port="8080" accept"
移除rich规则
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.174.135" port port="8080" protocol="tcp" accept"
重启:移除和添加规则都要重启才能生效
firewall-cmd --reload
查看所有规则
firewall-cmd --list-all #所有开启的规则