1、nginx简介
高性能的http和反向代理web服务器,优点:占用内存少、并发能力强,为性能而生,支持热部署,几乎能7*24小时不间断运行,另具有较高的稳定性
2、反向代理
正向代理:
配置代理服务器,通过代理服务器访问互联网服务
反向代理:
客户无感知,仅需访问反向代理服务器,反向代理服务器访问目标服务器获取响应结果,返回给客户端用户
说明:
正向代理就相当于你自己找了一个中介(代理服务),去商店(目标服务器)买东西,买过来之后转交给你;而反向代理相当于商店(目标服务器)雇佣了一个中介(代理服务器)放到那里,等着你来访问,然后中介去商店拿到你想要的东西给你;即正向代理为客户端代理,反向代理为服务器代理;
3、负载均衡
单个服务器解决不了的问题,通过增加服务器的数量,将之前集中到一台服务器上的请求,分散到多台服务器上执行,将负载分发到多个服务器上,就是负载均衡
4、动静分离
为了加快响应的解析速度,将静态资源和动态资源部署在不同的服务器上面,由不同的服务器进行解析,降低单个服务的访问压力
5、nginx安装
1、安装编译工具及库文件
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
2、安装pcre
使nginx支持Rewrite功能,依次执行如下命令
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
tar -zxvf pcre-8.35.tar.gz
cd pcre-8.35
./configure
make && make install(编译安装)
pcre-config --version(查看版本号)
3、安装nginx
wget http://nginx.org/download/nginx-1.17.10.tar.gz
tar zxvf nginx-1.6.2.tar.gz
cd nginx-1.17.10
./configure
--prefix=PATH : 指定nginx的安装目录。默认 /usr/local/nginx
--conf-path=PATH : 设置nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf
--user=name: 设置nginx工作进程的用户。安装完成后,可以随时在nginx.conf配置文件更改user指令。默认的用户名是nobody。--group=name类似
--with-pcre : 设置PCRE库的源码路径,如果已通过yum方式安装,使用--with-pcre自动找到库文件。使用--with-pcre=PATH时,需要从PCRE网站下载pcre库的源码(版本4.4 – 8.30)并解压,剩下的就交给Nginx的./configure和make来完成。perl正则表达式使用在location指令和 ngx_http_rewrite_module模块中。
--with-zlib=PATH : 指定 zlib(版本1.1.3 – 1.2.5)的源码解压目录。在默认就启用的网络传输压缩模块ngx_http_gzip_module时需要使用zlib 。
--with-http_ssl_module : 使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与openssl-devel已安装
--with-http_stub_status_module : 用来监控 Nginx 的当前状态
--with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如X-Real-IP 或 X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址
--add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模块都要重新编译(Tengine可以在新加入module时无需重新编译)
make && make install(编译安装)
查看安装版本(默认会在此目录下,如果要安装指定目录,在./configure时,可以进行指定)
cd /usr/local/nginx/sbin/nginx -v
启动nginx
cd /usr/local/nginx/sbin
./nginx
启动成功之后,开启防火墙80端口
firewall-cmd --list-all(查询已开放的端口号)
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
直接访问服务器ip地址即可
6、nginx常用命令
使用nginx命令前提条件,必须进入到nginx的sbin命令目录下(即此处的/usr/local/nginx/sbin)
查看版本号
./nginx -v
启动nginx
./nginx
关闭nginx
./nginx -s stop
重加载nginx(修改配置文件,不用重启直接加载生效)
./nginx -s reload
重启nginx
./nginx -s reopen
7、nginx配置文件
1、位置:
nginx分为解压目录和安装目录,如果在./configure时没有指定安装目录,那么默认的安装目录为(/usr/local/nginx),所有的操作是在安装目录下面进行的,当然配置文件修改的也是安装目录下面的,这个必须知道,不然更改解压目录下面的nginx.conf文件是无效的;
2、配置文件的组成部分
全局块(影响nginx整体服务运行的配置命令):
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
重点说明:
worker_processes:
nginx工作开启的进程数,默认情况下为1,如果没有性能问题不必修改;如果修改,官方认为修改为和cpu核心数一样即可,但是一般开到4个或者8个即可,在网上开优化就不大了;查看cpu核心数的命令(cat /proc/cpuinfo| grep "processor"| wc -l),如果设置数和cpu数不一致,则可能出现问题
events块(主要影响nginx与用户的网络链接):
events {
worker_connections 1024;
}
重点说明:
worker_connections:
单个工作进程可以允许同时建立外部连接的数量,数值越大,能同时处理的链接越多;此参数的设置和linux的系统内存,以及’进程最大可打开文件数‘(此参数受限于linux系统,可通过ulimit -命令查看)有关,如果worker_rlimit_nofile 设置会覆盖ulimit的值;
http块(服务器配置最多的部分):
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
8、反向代理配置
示例一:
linux系统安装tomcat,根据ip:8080访问tomcat主页,在nginx上面配置,通过80端口映射到tomcat主页的8080端口,即通过浏览器访问linux的http://ip,来跳转到http://ip:8080;配置如下图:
示例二:
通过访问http://ip:9000/a/a.html 转发到 http://ip:8080的服务器里面;
通过访问http://ip:9000/b/a.html 转发到http://ip1:8080的服务器里面;
转发规则根据不同的路径(/a/或者/b/)转发到不同的服务器(没有两台服务器的话,可以用两个tomcat不同的端口模拟,原理是以一样的),,别忘了开放服务器的9000端口,配置如下图:
’~‘符号代表使用正则,路径里面包含/a/则跳转到http://192.168.79.10:8080服务,包含/b/则跳转到http://192.168.79.11:8080服务
location 语法规则:
location [=|~|~*|^~|!~|!~*] /uri/ { … }
·操作符 = 为 精确匹配 拥有优先级,优先级最高,一旦匹配不在往下走,可以配置访问频率较高的固定链接;
·操作符 ^~ 为某个常规字符串开头 因为匹配的也较为准确 拥有绝对优先级,仅次=,可以是配置静态文件目录开头;
·操作符 ~ 表示区分大小写的正则匹配(uri区分大小写)没有绝对优先级,按文件顺序匹配;
·操作符 ~* 表示不区分大小写的正则匹配 没有绝对优先级,按文件顺序匹配;
·!为逻辑非操作
·!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 没有绝对优先级,按文件顺序匹配
·/ 通用匹配 表示任何请求都会匹配到 拥有绝对优先级,拥有的优先级最低
多个location配置的情况下匹配顺序为:
首先匹配=,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。
当有匹配成功时候,停止匹配,按当前匹配规则处理请求。也就是nginx的location有且只能被匹配一个
9、负载均衡
示例:
通过访问http://ip1/test/a.html ,平均转发到两台tomcat服务器内,即http://ip1:8080/test/a.html和http://ip2:8080/test/a.html,配置如下图(关键字upstream);
nginx的调度策略:
·轮询:默认的调度方式;
·weight:根据权重进行连接分配,权重越大,分配连接越多,默认值为1;
·ip_hash:按照访问的ip的hash值进行分配,同一个ip每次都会访问到第一次访问的服务器上,解决session共享问题;
·url_hash:根据url的hash值进行分配;
·least_conn:最少链接数,哪个服务器的链接数少,就分配给哪个服务器;
·fair(需要安装插件):最短响应时间分配,按后端服务器的响应时间进行分配,谁的响应时间短给谁;
10、动静分离
把动态请求和静态请求进行分开,nginx处理静态资源,tomcat处理动态资源;把静态文件单独放在一个服务器上,以提高访问的效率(tomcat不擅长静态文件的处理,另外可以对于不经常变动的静态你文件设置缓存时间expires),具体配置如下(也可指定后缀进行转发配置):
11、keepalive+nginx实现负载高可用
开篇讲述nginx是一个高可用的负载工具,但是也是有缺点的,如果只有一台入口nginx服务器,那么这台服务器一旦宕机,可想而知,整体服务全部垮掉,这肯定不是我们想要的结果,于是就引出了,目前比较流行的nginx集群实现模式,keepalive+nginx的主从备份;
keepalive是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障;
VRRP协议:
VRRP全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。
在VRRP协议实现里,虚拟路由器使用 00-00-5E-00-01-XX 作为虚拟MAC地址,XX就是唯一的 VRID (Virtual Router IDentifier),这个地址同一时间只有一个物理路由器占用。在虚拟路由器里面的物理路由器组里面通过多播IP地址 224.0.0.18 来定时发送通告消息。每个Router都有一个 1-255 之间的优先级别,级别最高的(highest priority)将成为主控(master)路由器。通过降低master的优先权可以让处于backup状态的路由器抢占(pro-empt)主路由器的状态,两个backup优先级相同的IP地址较大者为master,接管虚拟IP。
具体原理如下图:
yum install -y popt-devel
wget http://www.keepalived.org/software/keepalived-2.0.15.tar.gz
tar -zxvf keepalived-2.0.11.tar.gz
./configure --prefix=/ #这里说明keepalive默认配置文件路径为/etc/keepalive/keepalive.conf,不写--prefix=/的话会在/usr/local/etc/keepalive/keepalive.conf下面,有可能导致启动报错
make && make install
配置修改如下:
! Configuration File for keepalived
#全局配置
global_defs {
notification_email {
[email protected] ######定义发送邮件的邮箱
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id Hadoop2001 #服务器的名称
}
#脚本配置
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本
interval 2 #(检测脚本执行的间隔,单位是秒//脚本检测时间间隔,脚本必须在'间隔时间'内返回状态)
weight 2 #脚本成立的话,此服务器的权重调整为2
}
#虚拟ip配置
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
virtual_router_id 51 # 虚拟路由编号,主从要一致 ######虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换
priority 100 ######服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER
advert_int 1 ######服务器之间的存活检查时间
authentication {
auth_type PASS ######设置认证类型和认证密码
auth_pass 1111 ######认证密码,一组lvs 服务器的认证密码必须一致
}
virtual_ipaddress {
#如果是虚拟机多个系统服务的话,最好设置成和自己的虚拟机IP同网段(?和你ip在一个网段),因为交换机上没配相关路由,跨网段的时候是会存在路由问题的,如果你把VIP也设置为192.168.?.*应该就没这个问题了
192.168.?.* # 定义虚拟ip(VIP),可多设,每行一个,最好设置成和自己的虚拟机IP同网段,
192.168.*.17 # 定义虚拟ip(VIP),可多设,每行一个
192.168.*.18 # 定义虚拟ip(VIP),可多设,每行一个
}
}
附加说明:
检测脚本如果在window服务器上用txt直接编辑上传到linux的话要vi编辑:set ff=unix,不然无法执行;
另外一定要注意脚本返回的状态要在检测时间内返回,不然脚本无法执行完毕;
检测脚本:
1 #!/bin/bash
2 while :
3 do
4 nginxpid=`ps -C nginx --no-header | wc -l`
5 if [ $nginxpid -eq 0 ];then
6 #/usr/local/nginx/sbin/nginx
7 sleep 1
8 nginxpid=`ps -C nginx --no-header | wc -l`
9 echo $nginxpid
10 if [ $nginxpid -eq 0 ];then
11 systemctl stop keepalived
12 fi
13 fi
14 done
全部配置完毕之后,用systemctl status keepalived命令启动keepalive,如果报错,可能是因为安装时没有指定配置文件路径,进入/usr/local/etc/sysconfig目录,对其修改如下图,然后启动即可:
建立VRRP通信,防止出现脑裂(主备同时拥有vip);eth0:为您制定的网卡,固定的VRRP广播地址:224.0.0.18
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
# 查看配置的规则
firewall-cmd --direct --get-rules ipv4 filter INPUT
firewall-cmd --direct --get-rules ipv4 filter OUTPUT