1.什么是Nginx?
Nginx是一个高性能的HTTP反向代理服务器,特点是占用内存小,并发能力强。Nginx是专为性能优化而开发的,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。
详细介绍见 https://lnmp.org/nginx.html
2.反向代理
(1)正向代理:
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。
(2)反向代理:
客户端不需要做任何配置,只需要把请求发送到反向代理服务器,反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器在客户端眼里就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器的IP地址。
3.负载均衡
例如双11当天,并发量相当庞大,达到一个顶级的配置的服务器也承担不了的并发量,这样就增加服务器的数量,然后将请求分发到各个服务器上,将负载分发到不同的服务器就是负载均衡。
如下图,反向代理服务器通过负载均衡把15个请求平均分担到3个服务器。
4.动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低单个服务器的压力。
Nginx的常用命令
1.使用nginx命令的前提条件是进入到nginx的目录
cd /usr/local/nginx/sbin
2.查看nginx的版本号
./nginx -v
3.启动nginx
./nginx
4.关闭nginx
./nginx -s stop
5.重新加载nginx
修改nginx配置文件之后,不必重启nginx,重新加载nginx就行
./nginx -s reload
Nginx配置文件
1.位置在:
/usr/local/nginx/conf/nginx.conf
2.nginx配置文件组成
(1) 三部分组成
第一部分:全局块
从开始到events块之间的部分内容,主要设置一些影响nginx服务器整体运行的配置指令,例如 worker_processes 1 值越大,可以支持的并发数量也越多。第二部分:events块
events块设计的指令主要影响nginx服务器与用户的网络连接,例如worker_connections 1024 支持的最大连接数,对nginx的性能影响较大,应该灵活配置。第三部分:http块
①http全局块
http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
②server块
最核心需要配置的部分。
Nginx配置实例-反向代理
1.实现效果
(1)打开浏览器访问www.123.com,跳转到Linux系统tomcat的主页面。
2.准备工作
(1)Linux安装nginx
(2)Linux安装Tomcat
安装教程见https://www.jianshu.com/p/de8dbe029cee
3.访问过程分析
4.具体配置
(1)首先修改hosts文件,最后一行加上这个。因为浏览器解析域名会先到hosts文件中找对应的ip地址,没找到才会去网络中根据DNS解析。这样www.123.com就会被解析到ip为192.168.186.128的Linux服务器上了。
(2)在nginx配置文件中进行配置反向代理。
nginx的配置文件中这样配置到,如红线画的部分,当访问192.168.186.128的80端口的时候,请求会被转发到http://127.0.0.1:8080上。
Nginx反向代理实例2
1.实现效果
使用nginx监听9001端口,反向代理根据不同的访问路径跳转到不同端口的服务中。
访问http://192.168.186.128:9001/edu/ 直接跳转127.0.0.1:8080
访问http://192.168.186.128:9001/vod/ 直接跳转127.0.0.1:8081
2.准备工作
(1)准备两个Tomcat服务器,一个8080端口,一个8081端口
(2)创建文件夹和测试页面分别在两个tomcat的webapps文件中创建edu文件夹和vod文件夹,里面分别放入相应的测试页面文件。
这块遇到了一个大坑,就是一台centos7的机器同时开两个Tomcat的问题,网上试了很多教程都不行。
*****begin 一台CentOS7同时启动两个Tomcat教程*****
- 首先我用的tomcat9版本,解压缩重命名分别放在了以下两个位置,解压后重命名为了tomcat和tomcat1
/usr/local/tomcat
和
/usr/local/tomcat1
- 其次,修改/etc/profile文件,注意看tomcat部分
export JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export MAVEN_HOME=/root/installFile/apache-maven-3.6.2
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
########## tomcat ###########
export CATALINA_BASE=/usr/local/tomcat
export CATALINA_BASE=/usr/local/tomcat
export TOMCAT_HOME=/usr/local/tomcat
########## tomcat ############
########## tomcat1 ###########
export CATALINA_BASE2=/usr/local/tomcat1
export CATALINA_BASE2=/usr/local/tomcat1
export TOMCAT_HOME2=/usr/local/tomcat1
##########tomcat1#############
- 修改tomcat的配置
第一个tomcat不用做修改,修改第二个tomcat,如果有多个,则第一个不用修改,其余都要。
修改这个文件 vim /usr/local/tomcat1/bin/catalina.sh
# OS specific support. $var must be set to either true or false.
注释和内容之间的上面这句话后面添加:
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
- 修改/usr/local/tomcat1/conf/server.xml文件,把端口号改成8081,第一个tomcat不用改,其余的都要改。
我更改的3个地方,可以改成其他端口,自己决定
<Server port="8005" shutdown="SHUTDOWN"> #8005修改成8015
<Connector port="8080" protocol="HTTP/1.1" #8080修改成8081
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
#添加URIEncoding="UTF-8" 防止乱码
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/> #8009修改成8019
- 设置开机自启(注意此部分取自网络,未经亲测)
原文链接:https://blog.csdn.net/zhizhenjie/article/details/82662980
1、因为启动tomcat会调用tomcat安装文件中的startup.sh,而它调用了catalina.sh,然后catalina.sh则调用了setclasspath.sh。所以需要在setclaspath.sh中添加JAVA_HOME和JRE_HOME两个环境变量
分别编辑两个tomcat中的setclasspath.sh文件:
vi /usr/local/tomcat8/bin/setclasspath.sh
在 # Set JAVA_HOME or JRE_HOME…下边添加javahome:
# -----------------------------------------------------------------------------
# Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings
# are valid and consistent with the selected start-up options and set up the
# endorsed directory.
# -----------------------------------------------------------------------------
export JAVA_HOME=/usr/local/jdk1.8.0_181
export JRE_HOME=/usr/local/jdk1.8.0_181/jre
2、在/usr/lib/systemd/system目录下增加tomcat.service文件,内容如下:
[Unit]
Description=tomcat
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/tomcat8/bin/startup.sh
ExecStart=/usr/local/tomcat8.1/bin/startup.sh
ExecStop=/usr/local/tomcat8/bin/shutdown.sh
ExecStop=/usr/local/tomcat8.1/bin/shutdown.sh
ExecReload=/bin/kill -s HUP $MAINPID
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
将两个tomcat的启动程序都添加进去,
然后执行systemctl enable tomcat 使生效;开机启动就设置好了。
*****stop 一台CentOS7同时启动两个Tomcat教程*****
3.具体配置
记得开放对外访问端口9001和8080和8081
firewall-cmd --zone=public --add-port=8081/tcp --permanent //开启8081端口
firewall-cmd --zone=public --add-port=9001/tcp --permanent //开启9001端口
systemctl restart firewalld.service //重启防火墙
firewall-cmd --reload //重新载入防火墙配置
4.亲测效果
5.location指令具体说明
该指令用于匹配 URL。
语法如下:
location [ = | ~ | ~* | ^~ ] uri {
}
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~ 标识。
Nginx配置实例-负载均衡
1.实现效果
浏览器输入http://192.168.186.128:8080/edu/index.html经过nginx负载均衡,平均分配到8080和8081端口中。
2.准备工作
- 准备两台tomcat一台8080,一台8081,上面已经准备好了。
- 在两台tomcat的webapps的文件夹下都创建edu文件夹,里面都创建index.html文件。
3.在nginx中配置负载均衡
①如下图,在http里面加上
upstream myserver {
//这里面是负载均衡服务器的列表;
}
②然后把server里的server_name改成域名或者ip,相当于访问这个域名的这个端口,就负载均衡平均分配给上面配置的负载均衡服务器列表。
③把location里加上 proxy_pass=http://myserver;
4.亲测结果
- 最好用Edge测试,用google可能缓存原因吧,一直不变。
- 我这里做了host映射,所以可以直接访问www.123.com相当于访问192.168.186.128
-
地址不变,刷新,发现8080一次,8081一次,以此类推,负载均衡成功!!!
5.nginx分配服务器的策略
①轮询(默认策略)
每个请求按照时间顺序注意分配到后端服务器,如果后端服务器down掉,能够自动剔除。
②weight 权重策略
weight权重默认为1 权重越高,分配的客户端请求越多。
upstream myserver {
server 192.168.186.128:8080 weight=5;
server 192.168.186.128:8081 weight=10; #权重高于上面8080的,所以分配的请求也多一倍
}
③ip_hash
每个请求按照用户的ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session共享问题。
upstream myserver {
ip_hash;
server 192.168.186.128:8080;
server 192.168.186.128:8081;
}
④fair (第三方方式)
按照后端服务器的响应时间分配,响应时间越短,优先分配。
upstream myserver {
server 192.168.186.128:8080;
server 192.168.186.128:8081;
fair;
}
Nginx配置实例-动静分离
1.什么是动静分离?
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和 静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:
-
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使 浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资 源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送 一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。
2.准备工作
(1)在Linux系统中创建静态资源,用于进行访问
根目录 / 下创建data文件夹,下面创建www文件夹存放a.html,image文件夹存放01.jpg文件。
/data/www/a.html
/data/image/01.jpg
(2)实现的效果,不使用tomcat,通过nginx配置访问静态资源。
(3)nginx的配置
3.亲测效果
- 如下图所示:访问192.168.186.128/image把下面的目录都列出来了就是这句配置起的作用。
autoindex on;
-
访问192.168.186.128/image/01.jpg
-
访问192.168.186.128/www/a.html
如果加expires 参数也是加在location里面
location /image/ {
root /data/;
autoindex on;
expires 3d; //3天缓存过期时间
}
Nginx配置实例-高可用
1.什么是高可用?
(1)需要两台nginx服务器(我这里两台服务器的ip是192.168.8.128和192.168.8.129)
(2)需要keepalived相当于路由检测nginx服务器是否可以正常工作。
(3)需要虚拟ip绑定主从两台nginx服务器,用户访问的是虚拟ip。
2.准备工作
(1)需要两台服务器
(2)在两台服务器安装nginx
- 安装nginx见这里https://www.jianshu.com/p/de8dbe029cee
(3)在两台服务器安装keepalived
3.两台服务器都安装keepalived
yum install -y keepalived
- yum安装keepalived的默认安装目录是
/etc/keepalived/keepalived.conf
4.完成高可用的主从配置
(1)两台服务器都修改/etc/keepalived/keepalived.conf配置文件内容
#*******************************标记的是主从配置可能不同的地方
global_defs { #全局定义
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.8.128 #******************************************
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state MASTER # 主服务器为 MASTER 从服务器为 BACKUP *******************************
interface ens33 #网卡 ipconfig查看 *********************************************
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、从机取不同的优先级,主机值较大,备份机值较小 ************************
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 # VRRP H 虚拟地址
}
}
(2)两台服务器都在/usr/local/src中添加一个脚本文件nginx_check.sh内容如下
这个脚本就是检查nginx是否正常运行的脚本
#!/bin/bash
A=`ps -C nginx �Cno-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
(3)把两台服务器的nginx和keepalived都启动起来。
keepalived的启动命令:
systemctl start keepalived.service
5.亲测效果
(1)在浏览器中输入设置的虚拟ip看是否能访问,我这里设置的是192.168.8.50
发现可以访问到nginx的欢迎页面,通过ip a这个命令可以看到如下图,已经绑定了这个虚拟ip.
访问这个虚拟ip192.168.8.50进入nginx主页
(2)把主服务器192.168.8.128的nginx和keepalived停止
systemctl stop keepalived.service //停止keepalived
./nginx -s stop //停止nginx必须在nginx的sbin目录下执行
ps -ef | grep nginx //查看是否停掉了
ps -ef | grep keepalived
kill -9 PID //如果没停掉则用进程号停掉
(3)停掉主服务器后会自动切换到从服务器的nginx
继续访问192.168.8.50还是能访问到nginx主页
配置文件详解
#全局定义
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.8.128
smtp_connect_timeout 30
router_id LVS_DEVEL #最重要是这个LVS_DEVEL能访问到主机,
#因为在hosts文件中配置了127.0.0.1 LVS_DEVEL
}
#脚本文件
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight -20 #设置当前服务器的权重,当主服务器挂掉权重降低20,也就是自动切换到从服务器
}
#虚拟ip设置
vrrp_instance VI_1 {
state MASTER # 主服务器为 MASTER 从服务器为 BACKUP
interface ens33 #网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、从机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #每隔一秒发送心跳,判断主机是否活着
authentication { #校验方式
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 # VRRP H 虚拟地址 可以绑定多个
}
}
Nginx的基本原理
1.master和worker
-
可以通过查看进程ps -ef | grep nginx看到如下图所示:
matser相当于领导:分配任务
worker相当于工人:执行领导分配的任务
2.worker如何进行工作的
- 当master有任务了,由多个worker的争抢机制来得到任务。
3.一个master多个worker这种机制的好处
(1)可以使用./nginx -s reload 热部署,不用停止nginx更新配置,当worker抢到任务继续执行,执行完才更新配置,其他没有任务的收到./nginx -s reload命令直接更新配置。
(2)每个worker都是一个独立的进程,所以不需要加锁,省掉了加锁带来的开销。一个worker挂掉了,其他的worker会正常工作,继续进行争抢,降低了服务中断的风险。
4.设置多少个worker合适?
Nginx和redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式处理请求,即使上千万个请求也不在话下,每个worker的线程可以把CPU的性能发挥到极致。所以worker数量和CPU核心数相等时最为适宜的,设置少了浪费CPU,设置多了会造成CPU频繁切换上下文造成损耗。
- 因为windows中没有了io多路复用机制,所以功能虽然能实现,但是性能不能发挥极致,所以一般nginx和redis都是安装到Linux中。
5.连接数worker_connection
(1)发送一个请求占用worker几个连接数?
- 两个或四个。
- 因为如果只访问静态资源就两个连接(往返),如果是动态资源worker还需要访问tomcat,又一个往返。
(2)nginx中有1个master,4个worker,每个worker支持最大连接数1024,所以问支持的最大并发数是多少?
- 普通的静态访问最大并发数是: worker_connections * worker_processes /2,
- 而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4。