Nginx是一个高性能的HTTP和反向代理web服务器,是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强等。
文章目录
特点
1. 反向代理
-
正向代理(代理用户)
-
反向代理(代理服务器)
客户端只需要知道反代理服务器的地址,而不需要知道它后面的多个tomcat服务器的地址。
2. 负载均衡
增加服务器的数量,以降低对单个服务器的负载。
负载均衡策略
添加负载均衡后,要在location / {...}
中加入proxy_pass http://myserver;
。(myserver为定义的负载均衡列表名)
- 轮询:默认方式(缺省配置)
在轮询中,如果服务器down掉了,会自动剔除该服务器。
upstream myserver {
server 10.211.55.17:8080;
server 10.211.55.17:8081;
}
- weight:权重方式
weight参数用于指定轮询几率,weight的默认值为1。weight越大,被访问的比率越大。
upstream myserver {
server 10.211.55.17:8080 weight=5;
server 10.211.55.17:8081 weight=10;
}
- ip_hash:依据ip分配方式
客户端第一次访问到哪个服务器,之后会一直访问同一个服务器。也解决的session不能跨服务器的问题。
upstream myserver {
ip_hash;
server 10.211.55.17:8080;
server 10.211.55.17:8081;
}
- least_conn:最少连接方式
把客户端的请求发给连接比较少的服务器,使服务器整体负载相同。
upstream myserver {
least_conn;
server 10.211.55.17:8080;
server 10.211.55.17:8081;
}
- fair(第三方):响应时间方式
按照服务器端的响应时间来分配请求,响应时间短的优先分配。
upstream myserver {
server 10.211.55.17:8080;
server 10.211.55.17:8081;
fair;
}
- url_hash(第三方):依据URL分配方式
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,配合缓存使用。
upstream myserver {
hash $request_uri;
server 10.211.55.17:8080;
server 10.211.55.17:8081;
}
3. 动静分离
把静态资源和动态资源分别放在不同服务器上。
4. 高可用
高可用是为了解决只有一台nginx时,如果此时客户端发送请求,而nginx宕机了,请求就无法到达tomcat的问题。高可用是设置从nginx,如果主nginx宕机了,那么备nginx来实现反代理。
因为两个nginx的ip都是不一样的,所以对外需要一个虚拟ip,keepalived把虚拟ip挂到nginx1上,然后如同一个哨兵,检查nginx1的状态。当nginx1宕机了,keepalived就会把虚拟ip挂到nginx2上。
nginx常用命令
-
cd /usr/local/nginx/sbin
进入nginx目录 -
./nginx -v
查看nginx的版本号
-
./nginx
开启nginx
-
./nginx -s stop
停止nginx
-
./nginx -s reload
重新加载nginx
如果出现下面这种错误,需要用./nginx -c /usr/local/nginx/conf/nginx.conf
指定配置文件重启。此时,nginx目录下的logs目录会生成nginx.pid文件,就可以使用./nginx -s reload
命令重新加载nginx了。
nginx.conf配置文件
nginx.conf配置文件在nginx目录下的conf目录下,内容由全局块、events块和http块三部分组成。
建议拷贝一份nginx.conf,防止出现问题时恢复不了。
1. 全局块
#user nobody;
配置用户或者组,默认nobody
worker_processes 1;
允许生成的进程数,默认为1。
#error_log logs/error.log;
制定日志路径
#pid logs/nginx.pid;
指定nginx进程运行文件存放地址
2. events块
worker_connections 1024;
支持的最大连接数,默认1024
3. http块
http块由http全局块和server块组成。
- http全局块
include mime.types;
配置nginx支持哪些扩展名与文件类型映射表。在nginx/conf/mime.types可查看支持的文件类型。
default_type application/octet-stream;
默认文件类型(流),支持很多文件、图片、js/css等。
log_format main
自定义文件格式,默认即可。(文件的打印规则)
sendfile on;
优化参数,允许sendfile方式传输文件,开启高效传输模式。
#tcp_nopush on;
防止网络堵塞。
keepalive_timeout 65;
长连接超时时间(单位秒)
#gzip on;
开启gzip压缩
- server块(新版本nginx的server块在nginx.conf文件同个目录下的conf.d目录里的default.conf文件)
listen 80;
监听80端口
server_name localhost;
监听的地址
location / { root html; index index.html index.htm; }
在花括号里添加proxy_pass 转发地址;
实现页面转发
nginx配置实例
需要在centos7下有jdk1.8,tomcat,nginx等环境。
准备工作:
-
进入tomcat的bin目录,
./startup.sh
启动tomcat服务器。(此目录下./shutdown.sh
为关闭tomcat) -
进入nginx的sbin目录,
./nginx
启动nginx服务器(./nginx -s stop
为关闭)
-
开放8080和80端口
firewall-cmd --add-port=80/tcp --permanent
开放80端口
firewall-cmd --add-port=8080/tcp --permanent
开放8080端口
(怕麻烦可临时关闭防火墙:systemctl stop firewalld.service
(centos7的命令),临时关闭防火墙就不需要重启防火墙了)
CentOS7 关闭和开启防火墙 -
firewall-cmd --reload
重启防火墙(开放新端口后需要重启防火墙)
firewall-cmd --list-all
查看开放的端口
-
此时,如果linux下的tomcat和nginx都启动了的话,在外的浏览器输入linux的ip冒号加80就可以访问nginx主页面,加8080就可以访问tomcat主页面。(linux的ip输入
ifconfig
查看)
一、反向代理
实例1
需求:
在浏览器中输入www.123.com,页面跳转到linux系统的tomcat主页面。
- 修改本地的host文件,让其在输入www.123.com跳转到10.211.55.17。
(windows系统的host文件的路径:C:->Windows->System32->drivers->etc->HOSTS)
打开终端:
cd /private/etc
进入/private/etc
sudo vim hosts
进入hosts文件,需要权限(输入本机密码)
回车进入
:wq!
强制保存退出 - 然后在浏览器中输入www.123.com,页面成功跳转到10.211.55.17:80。
配置nginx.conf文件
- 把http块下面server块里的server_name修改为linux的ip。
- 然后在其下面几行的
location / {...}
中加入proxy_pass http://127.0.0.1:8080;
让其跳转到tomcat的主页面。
:wq
保存退出后,在浏览器输入www.123.com
成功跳转到tomcat的主页面。
- 如果输入
www.123.com
后是nginx的主页面,请到nginx的sbin目录下输入./nginx -s reload
重启nginx服务器,如果清除浏览器的缓存。
实例2
需求:
根据访问的路径跳转到不同端口的服务中
nginx监听8888端口
访问 http://10.211.55.17:8888/edu/a.html 跳转到127.0.0.1:8080/edu/a.html
访问 http://10.211.55.17:8888/vod/a.html 跳转到127.0.0.1:8081/vod/a.html
准备工作:
- 需要两个tomcat来实现我们的需求,所以解压我们的tomcat包。
- 进入tomcat2的conf目录,修改配置文件server.xml,让两个tomcat不冲突。
这里以我的配置文件行数为例(一共需要改三处):
-
修改22行,把8005改为8015。
-
修改69行,把8080改为8081。
-
修改119行,把8009改为8019。(注释也改,以防后面需要用到而忘改。)
-
然后进入两个tomcat的bin目录,
./startup.sh
分别启动两个tomcat,进入nginx的sbin目录,./nginx
启动nginx。 -
添加8081端口。
firewall-cmd --add-port=8081/tcp --permanent
开放8081端口
firewall-cmd --add-port=8888/tcp --permanent
开放8888端口
firewall-cmd --reload
重启防火墙
firewall-cmd --list-all
查看开放的端口
-
在浏览器测试
-
页面能打开后,我们需要新建目录和网站,用于等会不同路径的页面跳转。进入tomcat的webapp目录。
-
第一个tomcat新建edu目录,在目录下新建a.html,
-
第二个tomcat新建vod目录,在目录下新建a.html。
-
准备工作完成,接下来配置nginx。
配置nginx.conf
- 进入nginx/conf/nginx.conf配置文件。
改为
87 server {
88 listen 8888;
89 server_name 10.211.55.17;
90
91 location ~ /edu {
92 proxy_pass http://127.0.0.1:8080;
93 }
94 location ~ /vod {
95 proxy_pass http://127.0.0.1:8081;
96 }
97 }
-
打开浏览器输入10.211.55.17:8888,跳转成功。
-
访问 http://10.211.55.17:8888/edu/a.html跳转到127.0.0.1:8080/edu/a.html,跳转成功。
-
访问 http://10.211.55.17:8888/vod/a.html跳转到127.0.0.1:8081/vod/a.html,跳转成功。
二、负载均衡
需求:
浏览器中输入http://10.211.55.17/edu/a.html,实效负载均衡的效果,平均8080和8081端口中。
准备工作:
在两个tomcat的webapp目录下分别创建edu目录,在edu目录下创建a.html(之前8080的tomcat已经有edu和a.html了,所以只要在8081的tomcat创建就可以了)。
配置nginx.conf
- 修改nginx.conf配置文件
35 upstream myserver {
36 server 10.211.55.17:8080;
37 server 10.211.55.17:8081;
38
39 }
40
41 server {
42 listen 80;
43 server_name 10.211.55.17;
44
45 #charset koi8-r;
46
47 #access_log logs/host.access.log main;
48
49 location / {
50 proxy_pass http://myserver;
51 root html;
52 #proxy_pass http://127.0.0.1:8080;
53 index index.html index.htm;
54 }
- 重启nginx。(
./nginx -s reload
) - 在浏览器输入http://10.211.55.17/edu/a.html,刷新几次会发现页面在8080和8081之间切换。
三、动静分离
准备工作:
- 新建一个data目录,在里面新建www和image两个目录,在www目录中新建一个a.html用于测试。
2. 在Mac的终端往linux的data/image目录复制图片。
scp o1.jpeg root@10.211.55.17:/data/image
配置nginx.conf文件:
- 修改nginx.conf文件
40 server {
41 listen 80;
42 server_name 10.211.55.17;
43
44 #charset koi8-r;
45
46 #access_log logs/host.access.log main;
47
48 location /www/ {
49 root /data/;
50 index index.html index.htm;
51 }
52 location /image/ {
53 root /data/;
54 autoindex on;
55 }
- 重启nginx。
- 在浏览器中输入http://10.211.55.17/image/,显示出image目录下的内容。
- 点击o1.jpeg成功跳转。
- 输入http://10.211.55.17/www/a.html,成功跳转。
四、高可用集群
需要两台nginx,一个keepalived脚本,一个虚拟ip。
准备工作:
- 两台nginx分别需要对应的linux系统(虚拟机直接使用连接克隆,可以快速获得一台一样的linux)。
- 如果使用克隆,需要把第二台linux中nginx.conf的监控路径改成新的ip。
- 启动两台nginx,然后在浏览器中测试。
- 在两台服务器上安装keepalived。
yum install keepalived -y
安装keepalived
rpm -q -a keepalived
查看安装的keepalived版本
修改配置文件:
- 先修改主机的keepalived的配置文件。(keepalived配置文件在/etc/keepalived/下)
加了注释的都是需要改或者重要的(建议先备份一份keepalived.conf)。
1 ! Configuration File for keepalived
2
3 global_defs { #全局定义
4 notification_email {
5 acassen@firewall.loc
6 failover@firewall.loc
7 sysadmin@firewall.loc
8 }
9 notification_email_from Alexandre.Cassen@firewall.loc
10 smtp_server 192.168.200.1
11 smtp_connect_timeout 30
12 router_id LVS_DEVEL
13 vrrp_skip_check_adv_addr
14 vrrp_strict
15 vrrp_garp_interval 0
16 vrrp_gna_interval 0
17 router_id 10.211.55.17 #访问到本服务器
18 }
19
20 vrrp_script chk_hhttp_port { #检测脚本和权重的参数
21 script "/usr/local/src/nginx_check.sh" #检测监本(先写个路径,等会再写脚本)
22 interval 2 #检测脚本执行的间隔
23 weight 2 #权重
24 }
25
26 vrrp_instance VI_1 {
27 state MASTER #主,备份服务器为BACKUP
28 interface eth0 #网卡,ifconfig查看ip冒号前面为网卡
29 virtual_router_id 51 #主、备的virtual_router_id必须相同
30 priority 100 #优先级,主机的优先级大,备机小
31 advert_int 1
32 authentication {
33 auth_type PASS
34 auth_pass 1111
35 }
36 virtual_ipaddress {
37 10.211.55.100 #VRRP H虚拟地址
38 }
39 }
40 # 下面可不需要,可以都删了或者注释了
- 然后进入/usr/local/src/,新建nginx_check.sh文件。(这里因为使用的是root用户,所以有执行权限。如果是其他用户,需要先给权限)
1 #!/bin/bash
2 A=`ps -C nginx -no-header |wc -l`
3 if [ $A -eq 0 ];then
4 /usr/local/nginx/sbin/nginx
5 sleep 2
6 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
7 killall keepalived
8 fi
9 fi
-
修改备机的keepalived的配置文件。
和上面的代码有三处不同:- 把17行的
10.211.55.17
换成10.211.55.20
- 把27行的
MASTER
改为BACKUP
- 把30行的
100
改为90
- (用ifconfig查看网卡,如果网卡不同需要改28行)
- 把17行的
-
然后进入/usr/local/src/,新建nginx_check.sh文件,复制上面代码。
-
重启两台nginx。
-
先启动nginx再启动keepalived。
systemctl start keepalived.service
ps -ef | grep keepalived
查看keepalived进程。
-
然后在浏览器输入10.211.55.100,页面成功加载出来。
-
把主机的nginx停止,清除缓存然后重新访问。
./nginx -s stop
停止nginx
keepalived.conf配置文件
-
global_defs:全局配置
最重要是:router_id。通过这个id可以访问到这个服务器,写本机ip。 -
vrrp_script:脚本配置
- script:执行的检测脚本。
- interval:检测脚本的执行间隔(单位秒)
- weight:权重
-
vrrp_instance VI_1:虚拟ip配置
- state:服务器类型。(主服务器为MASTER,备份服务器为BACKUP)
- interface:本机绑定的网卡。
- virtual_router_id:主备机的id标识。(主、备的virtual_router_id必须相同)
- priority:优先级。(主机的优先级大,备机小)
advert_int:检测服务器是否存活的时间间隔,默认1秒(单位秒)
authentication { #权限校验
auth_type PASS #格式为密码
auth_pass 1111 #密码为1111
}
virtual_ipaddress { #可绑定多个虚拟ip
10.211.55.100 #VRRP H虚拟地址
}
nginx原理
-
master和worker
nginx启动后会有master和worker两个进程。master只有一个,worker可以有多个,master负责管理分配任务,worker负责执行master分配下来的任务。
-
worker的工作过程
当client发送请求,首先到master,然后master把请求分担给worker,多个worker采用争抢的方式决定哪个worker获得请求,然后反向代理调用tomcat。
-
一个master和多个worker的好处
- 可以使用
nginx -s reload
热部署(nginx不需要停止就可以让改过的配置文件生效)。 - 每个worker都是独立的进程,不需要加锁,其中如果有一个worker出现问题,其他worker可以继续进行争抢,实现请求过程,保证服务不被中断。
- 可以使用
-
worker数和服务器的cpu数相同最合适。
-
连接数worker_connection
-
发送请求,占用了worker的几个连接数?
答案:2个或者4个。
情况一:如果请求只要静态资源,那么请求到worker,然后worker把资源响应回去,一来一回为2个。
情况二:如果请求需要数据库的数据,那么发送请求到worker,worker发送给tomcat,让tomcat去数据库拿数据,然后,tomcat把数据给worker,worker再把数据响应给客户端,除了之前两个,还有和tomcat一来一回的两次。
-
nginx有一个master,有四个worker,每个worker支持最大的连接数据为1024,支持的最大并发数是多少?
答: worker最大支持的连接数:4 * 1024
最大并发数:最大连接数 / (2或4)
-
- 普通的静态访问最大并发数是:worker_connection * worker_processes / 2
- 如果是HTTP作为反代理来说,最大并发数是:worker_connection * worker_processes / 4