一、安装

环境:centos7.6、xshell6

参考:https://www.nginx.cn/install

安装PCRE库
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:

cd /usr/local/src wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
tar -zxvf pcre-8.44.tar.gz cd pcre-8.44 ./configure make make install prce -config —version image.png

安装zlib库
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip

cd /usr/local/src wget http://zlib.net/zlib-1.2.11.tar.gz tar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./configure make make install

安装ssl(某些vps默认没装ssl)
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http)

cd /usr/local/src wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz tar -zxvf openssl-1.1.1g.tar.gz

安装nginx

cd /usr/local/src wget http://nginx.org/download/nginx-1.18.0.tar.gz tar -zxvf nginx-1.18.0.tar.gz cd nginx-1.18.0 ./configure —sbin-path=/usr/local/nginx/nginx \ —conf-path=/usr/local/nginx/nginx.conf \ —pid-path=/usr/local/nginx/nginx.pid \ —with-http_gzip_static_module \ —with-http_stub_status_module \ —with-file-aio \ —with-http_realip_module \ —with-http_ssl_module \ —with-pcre=/usr/local/src/pcre-8.44 \ —with-zlib=/usr/local/src/zlib-1.2.11 \ —with-openssl=/usr/local/src/openssl-1.1.1g make -j2 make install

—with-pcre = / usr / local / src / pcre-8.44指的是pcre-8.44的源码路径。
—with-zlib = / usr / local / src / zlib-1.2.11指的是zlib-1.2 .11的原始路径。
安装成功后/ usr / local / nginx目录下如下
image.png
启动nginx

/usr/local/nginx/nginx

防火墙设置
nginx默认监听80端口

vim /usr/local/nginx/nginx.conf

image.png
查看开放的端口号

firewall-cmd —list-all

image.png
设置开放的端口号

firewall-cmd —add-service=http -permanent sudo firewall-cmd —add-port=80/tcp —permanent

重启防火墙

firewall-cmd —reload

浏览器访问IP
image.png
nginx编译选项
make是用来编译的,它从Makefile中读取指令,然后编译。
make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。
它定义了系统的各个方面,包括nginx的被允许使用的连接处理的方法,或者它会检测到你不是不是CC或GCC,不一定需要CC或GCC,它是一个shell脚本,执行结束时,它会创建一个Makefile文件。nginx的配置命令支持以下参数:

  • --prefix=path` 定义一个目录,存放服务器上的文件,也就是nginx的安装目录。替换使用/usr/local/nginx。`
  • --sbin-path=path设置nginx的重置文件的路径,替换为prefix/sbin/nginx
  • --conf-path=pathnginx允许使用不同的配置文件启动,通过命令行中的-c选项。设置为prefix/conf/nginx.conf
  • --pid-path=path 设置nginx.pid文件,将存储的主进程的进程号。安装完成后,可以随时改变的文件名 , 在nginx.conf配置文件中使用 PID指令。默认情况下,文件名 为```_prefix_/logs/nginx.pid`。
  • --error-log-path=path设置主错误,警告,和诊断文件的名称。安装完成后,可以随时更改的文件名,在nginx.conf配置文件中使用的error_log指令prefix/logs/error.log
  • --http-log-path=path安装完成后,可以随时更改的文件名,在nginx.conf配置文件中使用的access_log指令。或者在情况下,文件名为prefix/logs/access.log
  • --user=name`` 设置nginx工作进程的用户。安装完成后,可以随时更改的名称在nginx.conf配置文件中。
  • --group=name`` 设置nginx工作进程的用户组。安装完成后,可以随时更改的名称在nginx.conf配置文件中。
  • --with-select_module --without-select_module 启用或禁用构建一个模块来允许服务器使用select()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
  • --with-poll_module --without-poll_module 该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/ dev / poll。
  • --without-http_gzip_module —不编译压缩的HTTP服务器的响应模块。编译并运行此模块需要zlib库。
  • --without-http_rewrite_module 不编译重构模块。编译并运行此模块需要PCRE库支持。
  • --without-http_proxy_module —不编译http_proxy模块。
  • --with-http_ssl_module —使用https协议模块。有时情况下,该模块没有被编译。建立并运行此模块的OpenSSL库是必需的。
  • --with-pcre=path`` —设置PCRE库的二进制路径。PCRE库的二进制文件(版本4.4-8.30)需要从PCRE网站下载并解压缩。其余的工作是Nginx的。/configure和make来完成。正则表达式使用位置指令和ngx_http_rewrite_module模块中。
  • --with-pcre-jit —编译PCRE包含“即时编译”(1.1.12中,pcre_jit指令)。
  • --with-zlib=path`` —设置的zlib库的内核路径。要下载从zlib(版本1.1.3-1.2.5)的并解压。其余的工作是Nginx的。/configure和make完成。ngx_http_gzip_module模块需要使用zlib。
  • --with-cc-opt=parameters` 例如,当您在FreeBSD上使用PCRE库时需要使用:—with-cc-opt=”-I /usr/local/include。。如需要需要增加select()支持的文件数量—with-cc-opt=”-D FD_SETSIZE=2048”.`
  • --with-ld-opt=parameters` —设置附加的参数,将用于链接期间。例如,当在FreeBSD下使用该系统的PCRE库时,应指定:—with-ld-opt=”-L /usr/local/lib”.`

典型实例(以下为了展示需要写在多行,执行时内容需要在同一行)

./configure —sbin-path=/usr/local/nginx/nginx —conf-path=/usr/local/nginx/nginx.conf —pid-path=/usr/local/nginx/nginx.pid —with-http_ssl_module —with-pcre=../pcre-4.4 —with-zlib=../zlib-1.1.3

二、常用命令

1、使用Nginx操作命令前提条件:必须进入到nginx安装目录

cd /usr/local/nginx

2、查看nginx的版本号

./nginx -v image.png

3、启动nginx

./nginx image.png

4、关闭nginx

./nginx -s stop image.png

5、重新加载nginx

./nginx -s reload

三、nginx配置文件

image.png

  1. #user nobody;
  2. worker_processes 1;
  3. #error_log logs/error.log;
  4. #error_log logs/error.log notice;
  5. #error_log logs/error.log info;
  6. #pid logs/nginx.pid;
  7. events {
  8. worker_connections 1024;
  9. }
  10. http {
  11. include mime.types;
  12. default_type application/octet-stream;
  13. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  14. # '$status $body_bytes_sent "$http_referer" '
  15. # '"$http_user_agent" "$http_x_forwarded_for"';
  16. #access_log logs/access.log main;
  17. sendfile on;
  18. #tcp_nopush on;
  19. #keepalive_timeout 0;
  20. keepalive_timeout 65;
  21. #gzip on;
  22. server {
  23. listen 80;
  24. server_name localhost;
  25. #charset koi8-r;
  26. #access_log logs/host.access.log main;
  27. location / {
  28. root html;
  29. index index.html index.htm;
  30. }
  31. #error_page 404 /404.html;
  32. # redirect server error pages to the static page /50x.html
  33. #
  34. error_page 500 502 503 504 /50x.html;
  35. location = /50x.html {
  36. root html;
  37. }
  38. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  39. #
  40. #location ~ \.php$ {
  41. # proxy_pass http://127.0.0.1;
  42. #}
  43. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  44. #
  45. #location ~ \.php$ {
  46. # root html;
  47. # fastcgi_pass 127.0.0.1:9000;
  48. # fastcgi_index index.php;
  49. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  50. # include fastcgi_params;
  51. #}
  52. # deny access to .htaccess files, if Apache's document root
  53. # concurs with nginx's one
  54. #
  55. #location ~ /\.ht {
  56. # deny all;
  57. #}
  58. }
  59. # another virtual host using mix of IP-, name-, and port-based configuration
  60. #
  61. #server {
  62. # listen 8000;
  63. # listen somename:8080;
  64. # server_name somename alias another.alias;
  65. # location / {
  66. # root html;
  67. # index index.html index.htm;
  68. # }
  69. #}
  70. # HTTPS server
  71. #
  72. #server {
  73. # listen 443 ssl;
  74. # server_name localhost;
  75. # ssl_certificate cert.pem;
  76. # ssl_certificate_key cert.key;
  77. # ssl_session_cache shared:SSL:1m;
  78. # ssl_session_timeout 5m;
  79. # ssl_ciphers HIGH:!aNULL:!MD5;
  80. # ssl_prefer_server_ciphers on;
  81. # location / {
  82. # root html;
  83. # index index.html index.htm;
  84. # }
  85. #}

nginx.conf由三部分组成

  • 全局块

    • 从配置文件开始到event块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等。
    • 比如上面第一行配置的:worker_processes 1;
    • 这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约
  • events块

    • events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 wordprocess 可以同时支持的最大连接数等。
    • events { worker_connections 1024;}
    • 上述例子就表示每个 work process 支持的最大连接数为 1024。
    • 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
  • http块

    • 这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
    • 需要注意的是:http 块也可以包括 http 全局块、server 块。
    • http 全局块

      • http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
         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 块

      • 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
      • 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
      • 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
      • 全局 server 块
        • 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
      • location 块
        • 一个 server 块可以配置多个 location 块。
        • 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
        • location 指令说明
        • location [= | ~ | ~* | ^~] uri{}
          • = :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
          • ~:用于表示 uri 包含正则表达式,并且区分大小写。
          • ~*:用于表示 uri 包含正则表达式,并且不区分大小写。
          • ^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
          • 注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。 ```json server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }

<a name="fO3ju"></a>
## 四、Nginx配置实例
<a name="l12wo"></a>
### 1、反向代理
<a name="ameHf"></a>
#### 实例1
实现效果:打开浏览器,在浏览器地址栏输入地址 www.123.com ,跳转到 liunx 系统 tomcat 主页<br />准备工作:启动tomcat,开放防火墙端口(与上述开放端口步骤一致,80端口改为tomcat默认端口8080)
> cd /opt/tomcat/apache-tomcat-10.0.2/bin
> ./startup.sh

访问过程分析:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12731578/1615958220458-de0ba148-7336-4fe9-847f-fa9a06979de6.png#align=left&display=inline&height=162&margin=%5Bobject%20Object%5D&name=image.png&originHeight=324&originWidth=989&size=17820&status=done&style=none&width=494.5)<br />具体实现:<br />window下配置host,路径`C:\Windows\System32\drivers\etc`,添加`nginx主机    访问路径`<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12731578/1615959513724-14ff5a91-7321-4758-8717-a327274c806e.png#align=left&display=inline&height=43&margin=%5Bobject%20Object%5D&name=image.png&originHeight=86&originWidth=703&size=6109&status=done&style=none&width=351.5)<br />修改nginx.conf
> cd /usr/local/nginx/
> vim nginx.conf
> ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12731578/1615959656202-3f2daa7f-1959-4369-865f-fec0e3f0d2f4.png#align=left&display=inline&height=187&margin=%5Bobject%20Object%5D&name=image.png&originHeight=373&originWidth=899&size=26913&status=done&style=none&width=449.5)
> server_name:nginx的ip
> proxy_pass:tomcat的ip:port

重启nginx:`./nginx -s reload`<br />效果: ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12731578/1615959787128-31ed25cf-2f15-40bd-a3fb-cce13aedb8e2.png#align=left&display=inline&height=171&margin=%5Bobject%20Object%5D&name=image.png&originHeight=341&originWidth=2038&size=110782&status=done&style=none&width=1019)
<a name="11iNs"></a>
#### 实例2
实现效果:<br />使用 nginx 反向代理, 根据访问的路径跳转到不同端口的服务中<br />nginx 监听端口为 9001<br />访问 [http://192.168.66.66:9001/edu/](http://127.0.0.1:9001/edu/) 直接跳转到 127.0.0.1:8081<br />访问 [http://1](http://1%2027.0.0.1:9001/vod/)[92.168.66.66](http://127.0.0.1:9001/edu/):[9001](http://127.0.0.1:9001/edu/)[/vod/](http://1%2027.0.0.1:9001/vod/) 直接跳转到 127.0.0.1:8082

准备工作:<br />复制tomcat 目录`cp -r tomcat tomcat8081、cp -r tomcat tomcat8082`<br />进入tomcat的conf目录中的server.xml<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12731578/1615982108852-c4b56fdc-b103-49ad-86f9-543b4cf1615f.png#align=left&display=inline&height=103&margin=%5Bobject%20Object%5D&name=image.png&originHeight=206&originWidth=1189&size=34041&status=done&style=none&width=594.5)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12731578/1615982126131-50584ee7-b3ca-4768-89d0-281f85cb63e5.png#align=left&display=inline&height=152&margin=%5Bobject%20Object%5D&name=image.png&originHeight=303&originWidth=1235&size=35491&status=done&style=none&width=617.5)<br />两个comcat都要修改,一个8015、8081,一个8025、8082,<br />在bin目录下的`startup.sh和shutdown.sh`添加如下
```xml
export JAVA_HOME=/usr/local/java/jdk-15.0.2            #jdk路径
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/bin
export CATALINA_HOME=/opt/tomcat/tomcat8082            #tomcat安装目录
export CATALINA_BASE=/opt/tomcat/tomcat8082

进入bin目录./startup.sh启动两个tomcat服务。

在webapp目录下新建edu/vod文件,创建a.html

在usr/local/nginx下的server.xml 添加如下

 server {
        listen       9001;

        server_name  192.168.66.66;

        location ~ /edu/ {
                proxy_pass http://localhost:8081;
        }
        location ~ /vod/ {
                proxy_pass http://localhost:8082;
        }
    }

./nginx启动nginx
效果:
image.png

image.png

2、负载均衡

随着互联网信息的爆炸性增长,负载均衡(load balance )已经不再是一个很陌生的话题顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,nginx 就是其中的一个,在 linux 下有 Nginx 、 LVS 、 Haproxy 等等服务可以提供负载均衡服务

实例

实现效果:
浏览器地址栏输入地址 http://[1](http://1%2027.0.0.1:9001/vod/)[92.168.66.66](http://127.0.0.1:9001/edu/)[/edu/a.html](http://192.168.%2017.129/edu/a.html) ,负载均衡效果,平均 8081和 8082 端口中
准备工作:
准备两台 tomcat 服务器,一台 8081 ,一台 8082
在两台 tomcat 里面 webapps 目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建
页面 a.html ,用于测试
在 nginx 的配置文件中进行负载均衡的配置:
image.png
image.png

Nginx 提供了几种分配方式策略

  • 轮询(默认)
    • 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
  • weight
    • weight代表权重,默认为 1, 权重越高被分配的客户端越多
    • 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如:
    • upstream server_pool{ server 192.168.5.21 weight=10; server 192.168.5.22 weight=10; }
  • ip_hash
    • 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 例如: upstream server_pool{ ip_hash; server 192.168.5.21:80; server 192.168.5.22:80; }
  • 4、fair(第三方)
    • 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 upstream server_pool{ server 192.168.5.21:80; server 192.168.5.22:80; fair; }

3、动静分离

概述:
image.png
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx 处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种。

一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;

另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。

准备工作:
在 liunx 系统中准备静态资源,用于进行访问
image.png
在 nginx 配置文件中进行配置:
image.png

4、高可用集群

什么是 nginx 高可用
image.png
rpm -ivh Percona-XtraDB-Cluster-shared-55-5.5.37-25.10.756.el6.x86_64.rpm
2 、配置高可用的准备工作

  • 需要两台服务器 192.168.17.129 和 192.168.17.131
  • 在两台服务器安装 nginx
  • 在两台服务器安装 keepalived

3 、在两台服务器安装 keepalived
1 使用 yum 命令进行安装
yum install keepalived y
安装之后,在 etc 里面生成目录 keepalived ,有文件 keepalived.conf
keepalived配置文件

# 全局配置
global_defs {
   # 邮件通知信息
   notification_email {
     # 定义收件人
     acassen@firewall.loc
   }
   # 定义发件人
   notification_email_from Alexandre.Cassen@firewall.loc
   # SMTP服务器地址
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
   router_id LVS_DEVEL
   # VRRP的ipv4和ipv6的广播地址,配置了VIP的网卡向这个地址广播来宣告自己的配置信息,下面是默认值
   vrrp_mcast_group4 224.0.0.18
   vrrp_mcast_group6 ff02::12
}

# 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换
vrrp_script SCRIPT_NAME {

}

# 一个vrrp_instance就是定义一个虚拟路由器的,实例名称
vrrp_instance VI_1 {
    # 定义初始状态,可以是MASTER或者BACKUP
    state MASTER
    # 工作接口,通告选举使用哪个接口进行
    interface ens33
    # 虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟
    # ID还是虚拟MAC最后一段地址的信息,取值范围0-255
    virtual_router_id 51
    # 使用哪个虚拟MAC地址
    use_vmac XX:XX:XX:XX:XX
    # 监控本机上的哪个网卡,网卡一旦故障则需要把VIP转移出去
    track_interface {
        eth0
        ens33
    }
    # 如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高
    priority 100
    # 通告频率,单位为秒
    advert_int 1
    # 通信认证机制,这里是明文认证还有一种是加密认证
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 设置虚拟VIP地址,一般就设置一个,在LVS中这个就是为LVS主机设置VIP的,这样你就不用自己手动设置了
    virtual_ipaddress {
        # IP/掩码 dev 配置在哪个网卡
        192.168.200.16/24 dev eth1
        # IP/掩码 dev 配置在哪个网卡的哪个别名上
        192.168.200.17/24 dev label eth1:1
    }
    # 虚拟路由,在需要的情况下可以设置lvs主机 数据包在哪个网卡进来从哪个网卡出去
    virtual_routes {
        192.168.110.0/24 dev eth2
    }
    # 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt
    nopreempt|preempt
    # 如果是抢占默认则可以设置等多久再抢占,默认5分钟
    preempt delay 300
    # 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
    track_script {

    }
    # 三个指令,如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本,脚本要自己写
    notify_master ""
    notify_backup ""
    notify_fault ""
}

# 定义LVS集群服务,可以是IP+PORT;也可以是fwmark 数字,也就是防火墙规则
# 所以通过这里就可以看出来keepalive天生就是为ipvs而设计的
virtual_server 10.10.10.2 1358 {
    delay_loop 6
    # 算法
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh 
    # LVS的模式
    lb_kind NAT|DR|TUN
    # 子网掩码,这个掩码是VIP的掩码
    nat_mask 255.255.255.0
    # 持久连接超时时间
    persistence_timeout 50
    # 定义协议
    protocol TCP
    # 如果后端应用服务器都不可用,就会定向到那个服务器上
    sorry_server 192.168.200.200 1358

    # 后端应用服务器 IP PORT
    real_server 192.168.200.2 1358 {
        # 权重
        weight 1
        # MSIC_CHECK|SMTP_CHEKC|TCP_CHECK|SSL_GET|HTTP_GET这些都是
        # 针对应用服务器做健康检查的方法
        MISC_CHECK {}
        # 用于检查SMTP服务器的
        SMTP_CHEKC {}

        # 如果应用服务器不是WEB服务器,就用TCP_CHECK检查
        TCP_CHECK {
          # 向哪一个端口检查,如果不指定默认使用上面定义的端口
          connect_port <PORT>
          # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
          bindto <IP>
          # 连接超时时间
          connect_timeout 3
        }

        # 如果对方是HTTPS服务器就用SSL_GET方法去检查,里面配置的内容和HTTP_GET一样
        SSL_GET {}

        # 应用服务器UP或者DOWN,就执行那个脚本
        notify_up "这里写的是路径,如果脚本后有参数,整体路径+参数引起来"
        notify_down "/PATH/SCRIPTS.sh 参数"

        # 使用HTTP_GET方法去检查
        HTTP_GET {
            # 检测URL
            url { 
              # 具体检测哪一个URL
              path /testurl/test.jsp
              # 检测内容的哈希值
              digest 640205b7b0fc66c1ea91c463fac6334d
              # 除了检测哈希值还可以检测状态码,比如HTTP的200 表示正常,两种方法二选一即可
              status_code 200
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            # 向哪一个端口检查,如果不指定默认使用上面定义的端口
            connect_port <PORT>
            # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
            bindto <IP>
            # 连接超时时间
            connect_timeout 3
            # 尝试次数
            nb_get_retry 3
            # 每次尝试之间间隔几秒
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

完成高可用配置(主从配置)
1 )修改 /etc/keepalived/keepalivec.conf 配置文件

global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 1 92.168.17.129
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 BACKUP # 备份服务器上将 MASTER 改为 BA CKUP
interface ens33 // 网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1

vim /usr/local/src/nginx_check.sh

#!/bin/bash
A=`ps
C nginx no 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 启动
启动 nginx ::./nginx
启动 keepalived systemctl start keepalived.service

nginx 原理与优化参数配置

image.png
image.png
master-workers 的机制的好处
首先,对于每个worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断, master 进程则很快启动新的worker 进程。当然, worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

需要设置多少个worker
Nginx同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu数相等是最为适宜的。设少了会浪费 cpu ,设多了会造成 cpu 频繁切换上下文带来的损耗。

#设置 worker 数量。
worker_processes 4

#work绑定 cpu(4 work 绑定 4cpu) 。
worker_cpu_affinity 0001 0010 0100 1000

#work绑定 cpu (4 work 绑定 8cpu 中的 4 个 ) 。
worker_cpu_affinity 0000001 00000010 0000010000001000

连接数worker_connection
这个值是表示每个worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接数,应该是 worker_connections worker_processes 。当然,这里说的是最大连接数,对于HTTP 请求本地资源来说,能够支持的最大并发数量是 worker_connections worker_processes ,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections worker_processes /2 ,而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
image.png