nginx

nginx简介

  1. nginx (engine x) 是一个高性能的HTTP和反向代理服务器,同时也提供了IMAP/POP3/SMTP服务。nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004104日。
  2. nginx将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。201161日,nginx 1.0.4发布。
  3. nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

nginx优点

  • 高并发响应性能非常好,官方Nginx 处理静态文件并发 5w/s;
  • 反向代理性能非常强,可用于负载均衡;
  • 内存和 cpu 占用率低,只有 Apache的 1/5-1/10;
  • 对后端服务有健康检查功能;
  • 配置代码简洁且容易上手;
  • 支持热部署;

nginx应用场景

  1. 在不加载第三方模块的情况下,nginx可以用于实现:正向代理、反向代理、负载均衡、动静分离。

正向代理与反向代理

正向代理

  1. 在如今的网络环境下,如果需要去访问国外的某些网站,通过浏览器是没有办法直接访问的,需要翻墙进行访问(找到一个可以访问国外网站的代理服务器,将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给客户端)。

以上的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址,服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端。因此正向代理模式屏蔽或者隐藏了真实客户端信息。

正向代理原理图.png

  1. 使用正向代理时,客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。

正向代理客户端设置示意图.png

  1. 总的来说,正向代理,"代理的是客户端,代客户端发出请求",是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

正向代理的用途:

  • 访问原来无法访问的资源,如Google;
  • 可以做缓存,加速访问资源;
  • 对客户端访问授权,上网进行认证;
  • 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息;

反向代理

  1. 反向代理(Reverse Proxy),是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
  2. 简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境(当然也可能是同一台服务器,端口不同而已)。

负载均衡原理图.png

  1. 由上图可知,多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色。

客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。

反向代理,”它代理的是服务端,代服务端接收请求”,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。

反向代理的作用:

  • 保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网;
  • 负载均衡,通过反向代理服务器来优化网站的负载;

正向代理与反向代理的区别

正向代理与反射代理的区别.png

  • 在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;
  • 在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息;

    1. 实际上,Proxy在两种代理中做的事情都是替服务器代为收发请求和响应,不过从结构上看正好左右互换了一下,所以把后出现的那种代理方式称为反向代理了。

负载均衡

  1. 负载均衡也是nginx常用的一个功能,负载均衡的意思就是将多个操作分摊到多个操作单元上进行执行。例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
  2. nginx将接收到的客户端请求按照规则分发的过程,称为负载均衡。
  3. **配置负载均衡需要同时配置反向代理,通过反向代理实现负载均衡**。
  4. 负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种。硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障,大型企业才会选择硬负载进行操作;考虑到成本因素,大部分企业会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种**消息队列**分发机制。

nginx(三阶段) - 图5

动静分离

  1. nginx动静分离简单来说就是把动态请求跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离,可以理解成使用 nginx 处理静态页面,tomcat 处理动态页面。
  2. 动静分离从目前实现角度来讲大致分为两种:
  • 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
  • 一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

    1. 通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。

负载均衡原理图.png

  1. 动静分离的好处:
  • nginx本身就是一个高效的静态资源服务器;
  • 动静分离以后可以对静态文件进行缓存、或者压缩,以提高网站性能 ;

动静分离实现.png

nginx安装

  1. 作为web服务器,nginx一般安装于linux系统上(当然,nginx也有windows版本)。

步骤1:下载nginx

  1. nginx官网下载:[http://nginx.org/en/download.html](http://nginx.org/en/download.html),下载nginx-1.18.0.tar.gz,使用filezilla上传到linux,解压后移动到/usr/local目录中。

步骤2:安装nginx所需的依赖(pcre、openssl、zlib)

pcre:

  1. 联网下载
  2. wget http://downloads.sourceforge.net/project/pcre/pcre/8.41/pcre-8.41.tar.gz
  3. 解压
  4. tar zxvf pcre-8.41.tar.gz
  5. 进入pcre解压目录
  6. cd pcre-8.41
  7. 检查配置
  8. ./configure
  9. 如果检查过程出错,要求提供C++支持,执行以下操作,不出错不执行
  10. yum install -y gcc gcc-c++
  11. 增加了C++支持后,需要重新执行./configure命令进行配置,然后才能执行安装操作。
  12. 安装
  13. make && make install
  14. 查看版本
  15. pcre-config --version
  16. 出现8.41代表安装成功

openssl、zlib:yum安装

  1. yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel

步骤3:安装nginx

  1. 进入nginx解压目录
  2. cd nginx-1.18.0
  3. 检查配置
  4. ./configure
  5. 安装
  6. make && make install
  7. 进入nginx目录
  8. cd /usr/local/nginx/sbin
  9. 测试nginx是否安装成功
  10. ./nginx -v
  11. 如提示./nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory,是软连接没有建立的原因
  12. 查找libpcre.so文件所在位置
  13. find / -type f -name *libpcre.so.*
  14. 建立软连接
  15. ln -s /lib64/libpcre.so.0.0.1 /lib64/libpcre.so.1
  16. 再次测试安装是否成功
  17. ./nginx -v
  18. 出现nginx version: nginx/1.18.0代表安装成功
  19. 启动nginx
  20. ./nginx
  21. 如提示:
  22. nginx: [alert] could not open error log file: open() "/usr/local/nginx/logs/error.log" failed (2: No such file or directory)
  23. 2020/09/25 04:01:00 [emerg] 35913#0: open() "/usr/local/nginx/logs/access.log" failed (2: No such file or directory)
  24. 表示nginx需要logs目录用于记录启动日志,如果没有该目录,nginx无法启动,需要手动在nginx目录中创建该目录。
  25. 在浏览器中输入服务器ip,如果能够访问nginx欢迎页面即代表nginx可以正常使用,如不能访问,则是nginx默认的端口号80在防火墙中被拦截,需放开。
  26. 在防火墙中放开80端口(nginx默认监控的端口号)
  27. vim /etc/sysconfig/iptables
  28. 复制22端口所在行,粘贴并将22改为80
  29. 重启防火墙
  30. service iptables restart
  31. 关闭nginx
  32. ./nginx -s stop
  33. 启动nginx
  34. ./nginx
  35. 此时在浏览器中应可正常访问nginx
  1. **注意:由于nginx执行脚本在安装目录/sbin目录中,因此运行和关闭nginx相关指令需要进入到sbin目录中才可以执行。**
  2. **与nginx服务相关的常用命令**
  1. ./nginx -v 查看版本号
  2. ./nginx 启动nginx
  3. ./nginx -s stop 关闭nginx
  4. ./nginx -s reload 重新加载nginxnginx配置文件被修改时可以执行该指令让新配置对当前nginx服务生效)

nginx配置文件

  1. nginx 默认的配置文件都放在安装目录中的 conf 目录下,而主配置文件 nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改。
  2. nginx的配置文件:/usr/local/nginx/conf/nginx.conf,用于对nginx服务进行配置,该配置文件中的内容分为三块:全局块、events块、http块。

全局块

  1. 主要用于设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

events块

  1. events块涉及的指令主要影响nginx 服务器与用户的网络连接。
  2. 常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。

http块

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

http全局块

  1. http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。该块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

server块

  1. 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块。

全局server块
  1. 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

location块
  1. 一个 server 块可以配置多个 location 块。该块的主要作用是基于nginx服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。
  2. 此外,还可以在该块中进行地址定向、数据缓存和应答控制等功能配置,以及许多第三方模块的配置也在这里进行。
  1. #从此处起到events之前,属于全局块。
  2. #user nobody;
  3. #nginx服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
  4. worker_processes 1;
  5. #error_log logs/error.log;
  6. #error_log logs/error.log notice;
  7. #error_log logs/error.log info;
  8. #pid logs/nginx.pid;
  9. #此处为events块
  10. events {
  11. #每个work process支持的最大连接数为1024,这部分的配置对nginx的性能影响较大,在实际中应该灵活配置。
  12. worker_connections 1024;
  13. }
  14. #此处为http块
  15. http {
  16. #从此处起到server之前,属于http全局块
  17. include mime.types;
  18. default_type application/octet-stream;
  19. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  20. # '$status $body_bytes_sent "$http_referer" '
  21. # '"$http_user_agent" "$http_x_forwarded_for"';
  22. #access_log logs/access.log main;
  23. sendfile on;
  24. #tcp_nopush on;
  25. #keepalive_timeout 0;
  26. keepalive_timeout 65;
  27. #gzip on;
  28. #此处为server块
  29. server {
  30. #从此处起到location之前,属于全局server块
  31. listen 80;
  32. server_name localhost;
  33. #charset koi8-r;
  34. #access_log logs/host.access.log main;
  35. #此处为location块
  36. location / {
  37. root html;
  38. index index.html index.htm;
  39. }
  40. #error_page 404 /404.html;
  41. # redirect server error pages to the static page /50x.html
  42. #
  43. error_page 500 502 503 504 /50x.html;
  44. location = /50x.html {
  45. root html;
  46. }
  47. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  48. #
  49. #location ~ \.php$ {
  50. # proxy_pass http://127.0.0.1;
  51. #}
  52. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  53. #
  54. #location ~ \.php$ {
  55. # root html;
  56. # fastcgi_pass 127.0.0.1:9000;
  57. # fastcgi_index index.php;
  58. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  59. # include fastcgi_params;
  60. #}
  61. # deny access to .htaccess files, if Apache's document root
  62. # concurs with nginx's one
  63. #
  64. #location ~ /\.ht {
  65. # deny all;
  66. #}
  67. }
  68. # another virtual host using mix of IP-, name-, and port-based configuration
  69. #
  70. #server {
  71. # listen 8000;
  72. # listen somename:8080;
  73. # server_name somename alias another.alias;
  74. # location / {
  75. # root html;
  76. # index index.html index.htm;
  77. # }
  78. #}
  79. # HTTPS server
  80. #
  81. #server {
  82. # listen 443 ssl;
  83. # server_name localhost;
  84. # ssl_certificate cert.pem;
  85. # ssl_certificate_key cert.key;
  86. # ssl_session_cache shared:SSL:1m;
  87. # ssl_session_timeout 5m;
  88. # ssl_ciphers HIGH:!aNULL:!MD5;
  89. # ssl_prefer_server_ciphers on;
  90. # location / {
  91. # root html;
  92. # index index.html index.htm;
  93. # }
  94. #}
  95. }

nginx应用

反向代理

需求1:通过www.wsjy.com访问linux系统中部署在tomcat中的taotao项目。

步骤1:在linux系统中安装jdk、tomcat、nginx,在防火墙中放开80(nginx)和8080(tomcat)端口,将taotao项目部署到服务器的tomcat中,启动tomcat。

步骤2:修改hosts文件,将www.wsjy.com域名与远程服务器ip相匹配

  1. hosts文件位于c:/windows/system32/drivers/etc/中,选择以记事本方式可以打开编辑。
  2. 一般该文件普通用户没有权限对其进行修改,可以右键单击->属性->安全->user->编辑->勾选修改和写入->确定,为当前用户赋予修改该文件的权限。此后在文件中写入“ip 域名”后保存退出即可,如:
  3. 192.168.113.137 www.wsjy.com
  4. 验证:
  5. 在浏览器中输入www.wsjy.com:8080/taotao,可以正常访问部署在服务器中的taotao项目。
  6. 使用www.wsjy.com/taotao访问时,会出现404

步骤3:配置nginx反向代理,使客户端浏览器通过www.wsjy.com/taotao即可访问服务器中的taotao项目。

  1. 修改nginx配置文件,配置反向代理
  2. vim /usr/local/nginx/conf/nginx.conf
  3. 修改http块中的server块:
  4. 1、将全局server块中的server_name指向要跳转的服务器ip地址
  5. server_name 192.168.113.137
  6. 2、在location块中增加代理路径,使客户端请求跳转到服务器的8080端口。
  7. proxy_pass http://127.0.0.1:8080
  8. 保存退出并重启nginx

步骤4:测试

  1. 在客户端浏览器中输入www.wsjy.com/taotao,此时可以正常访问部署在服务器中的taotao项目。

需求2:通过www.wsjy.com访问linux系统中部署在不同tomcat中的项目。

  1. http://www.wsjy.com/taotao
  2. http://www.wsjy.com/baobao

步骤1:在linux中将tomcat复制两份,命名为tomcat8081和tomcat8082

  1. cp -r /usr/local/tomcat8 /usr/local/tomcat8081
  2. cp -r /usr/local/tomcat8 /usr/local/tomcat8082

步骤2:配置环境变量

  1. vim /etc/profile
  2. 加入以下内容
  3. #tomcat8081
  4. export TOMCAT_HOME2=/usr/local/tomcat8081
  5. export CATALINA_BASE2=/usr/local/tomcat8081
  6. export CATALINA_HOME2=/usr/local/tomcat8081
  7. #tomcat8082
  8. export TOMCAT_HOME3=/usr/local/tomcat8082
  9. export CATALINA_BASE3=/usr/local/tomcat8082
  10. export CATALINA_HOME3=/usr/local/tomcat8082
  11. 引入环境变量
  12. source /etc/profile

步骤3:修改tomcat8081和tomcat8082配置文件

  1. vim /usr/local/tomcat8081/conf/server.xml
  2. server标签中的port值由默认的8005改变8006
  3. <Server port="8006" shutdown="SHUTDOWN">
  4. 将第一个connector标签中的port值由默认的8080改变8081
  5. <Connector port="8081" protocol="HTTP/1.1"
  6. connectionTimeout="20000"
  7. redirectPort="8443" />
  8. 将第二个connector标签中的port值由默认的8009改为8010
  9. <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
  10. vim /usr/local/tomcat8082/conf/server.xml
  11. server标签中的port值由默认的8005改变8007
  12. <Server port="8007" shutdown="SHUTDOWN">
  13. 将第一个connector标签中的port值由默认的8080改变8082
  14. <Connector port="8082" protocol="HTTP/1.1"
  15. connectionTimeout="20000"
  16. redirectPort="8443" />
  17. 将第二个connector标签中的port值由默认的8009改为8010
  18. <Connector port="8011" protocol="AJP/1.3" redirectPort="8443" />

步骤5:修改tomcat8081和tomcat8082的启动和关闭命令

  1. vim /usr/local/tomcat8081/bin/startup.sh
  2. vim /usr/local/tomcat8081/bin/shutdown.sh
  3. 增加以下内容
  4. export JAVA_HOME=/usr/local/jdk
  5. export PATH=$PATH:$JAVA_HOME/bin
  6. #export CLASSPATH=$JAVA_HOME/bin ---->服务器安装的是jdk1.8之前的版本需要,之后的版本可以不加
  7. export CATALINA_HOME=$CATALINA_HOME2
  8. export CATALINA_BASE=$CATALINA_BASE2
  9. vim /usr/local/tomcat8082/bin/startup.sh
  10. vim /usr/local/tomcat8082/bin/shutdown.sh
  11. 增加以下内容
  12. export JAVA_HOME=/usr/local/jdk
  13. export PATH=$PATH:$JAVA_HOME/bin
  14. #export CLASSPATH=$JAVA_HOME/bin
  15. export CATALINA_HOME=$CATALINA_HOME3
  16. export CATALINA_BASE=$CATALINA_BASE3

步骤6:分别启动tomcat8081和tomcat8082,并通过浏览器访问。

  1. 192.168.113.137:8081
  2. 192.168.113.137:8082
  3. 如果都可以访问tomcat启动页面,即成功。

步骤7:将部署在tomcat8中的taotao项目复制到tomcat8081和tomcat8082的webapps目录中

  1. cp -r /usr/local/tomcat8/webapps/taotao.war /usr/local/tomcat8081/webapps/baobao.war
  2. cp -r /usr/local/tomcat8/webapps/taotao.war /usr/local/tomcat8082/webapps/tiantian.war

步骤8:配置反向代理

  1. 修改nginx配置文件,配置反向代理
  2. vim /usr/local/nginx/conf/nginx.conf
  3. 由于之前已经配置了监听80端口,此处应配置nginx重新监听一个端口(比如9001,记得在防火墙中放开对9001端口限制),因此需要在http块中新增一个server块。
  4. server{
  5. listen 9001;
  6. server_name 192.168.113.137;
  7. location ~ /baobao/ {
  8. proxy_pass http://127.0.0.1:8080;
  9. }
  10. location ~ /tiantian/ {
  11. proxy_pass http://127.0.0.1:8081;
  12. }
  13. }

location指令说明: 语法: location [=|*|^~] uri { }

  • = :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
  • ~:用于表示 uri 包含正则表达式,并且区分大小写。
  • ~*:用于表示 uri 包含正则表达式,并且不区分大小写。
  • ^~:用于不含正则表达式的 uri 前,要求 nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

步骤9:放开9001端口

  1. vim /etc/sysconfig/iptables
  2. 放开9001端口限制
  3. service iptables restart
  4. 重启nginx

步骤10:测试

  1. 在浏览器中输入www.wsjy.com:9001/baobao,此时可以正常访问部署在tomcat8081服务器中的baobao项目。
  2. 在浏览器中输入www.wsjy.com:9001/tiantian,此时可以正常访问部署在tomcat8082服务器中的tiantian项目。

负载均衡

需求:客户端向www.wsjy.com/taotao发送请求,使用nginx实现负载均衡将不同请求分发到不同的服务器。

步骤1:将tomcat8中的taotao项目分别复制到两台tomcat(tomcat8081、tomcat8082)的webapps后,分别启动两台tomcat。

  1. cp -r /usr/local/tomcat8/webapps/taotao.war /usr/local/tomcat8081/webapps
  2. cp -r /usr/local/tomcat8/webapps/taotao.war /usr/local/tomcat8082/webapps

步骤2:修改nginx.conf,配置负载均衡

配置负载均衡
1、在http全局块中配置upstream块
upstream myservers{
    server 192.168.113.137:8081;
    server 192.168.113.137:8082;
}
2、在location块中将proxy_pass指向upstream
location / {
    root   html;
    proxy_pass http://myservers;
    index  index.html index.htm;
}

nginx支持的负载均衡调度算法方式如下:

  1. weight轮询(默认,常用,具有HA功效):接收到的请求按照权重分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
upstream myservers{
    server 192.168.113.137:8081 weight=10;
    server 192.168.113.137:8082 weight=1;
}
  1. ip_hash(常用):每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
upstream myservers{
    ip_hash;
    server 192.168.113.137:8081;
    server 192.168.113.137:8082;
}
  1. fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,需要安装upstream_fair模块。
upstream myservers{
    server 192.168.113.137:8081;
    server 192.168.113.137:8082;
    fair;
}
  1. url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包。
upstream myservers{
    hash $request_uri;
    server 192.168.113.137:8081;
    server 192.168.113.137:8082;
}

步骤3:测试

在客户端浏览器中输入www.wsjy.com/taotao,根据策略会自动转发访问不同的服务器。

动静分离

需求:使用url控制访问服务器中的动态资源(taotao项目)和静态资源(存放于data/images中的loading.gif)

步骤1:在linux根目录中创建data/images目录,上传图片loading.gif

步骤2:配置动静分离

在server块中新增访问静态资源的location块
location /images/ {
    root /data/; #请求uri中有images时,实际访问路径为:root+uri中的images(/data/images/)
    autoindex on; #访问images时自动列出当前目录中的所有内容
}
保存退出后重启nginx

location块中的root也可以使用alias:

location /images/ {
    alias /data/images/; #请求uri中有images时,实际访问路径为alias指定的路径:/data/images/
    autoindex on; #访问images时自动列出当前目录中的所有内容
}

步骤3:测试

在客户端浏览器中输入www.wsjy.com/taotao,访问动态项目taotao。
在客户端浏览器中输入www.wsjy.com/images/,列出服务器/data/images目录中所有文件。
在客户端浏览器中输入www.wsjy.com/images/loading.gif,访问图片。

Keepalived+Nginx 高可用集群(主从模式)

    所谓nginx高可用,就是指当某台nginx服务器宕机之后,系统能够继续正常运行,一般来说,会通过配置多台nginx服务器来完成nginx的高可用,当主服务器master宕机后,可以使用备用服务器backup来支持系统运行。

    要实现nginx的高可用,前提是需要判断主服务器是否宕机,因为只有主服务器宕机之后,才需要启用备用服务器——可以使用keepalived完成这个过程,keepalived会每过指定时间向主服务器发送验证请求,在主服务器宕机无法给予回应后,keepalived会根据设定,自动启用备用服务器提供服务。

nginx(三阶段) - 图8

需求:实现nginx高可用

步骤1:为安装好环境的nginx虚拟机拍摄快照,并clone两份,分别叫nginx_master和nginx_backup,启动两台虚拟机。

步骤2:为nginx_master和nginx_backup安装keepalived。

安装
yum install keepalived -y;
验证是否安装成功
rpm -q -a keepalived;
出现对应版本号,安装成功
    keepalived会被安装在/etc目录中。

步骤3:创建keepalived检测nginx状态的脚本。

vim /usr/local/src/checkNginxState.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

步骤4:设置nginx_master和nginx_backup服务器主机名

nginx_master
vim /etc/hosts
添加一行
127.0.0.1   nginx_master

nginx_backup
vim /etc/hosts
添加一行
127.0.0.1   nginx_backup

步骤5:修改keepalived配置文件完成高可用配置。

nginx_master
主要是三个方面的配置:全局定义、检测脚本配置、虚拟IP
vim /etc/keepalived/keepalived.conf

配置文件内容如下:
! Configuration File for keepalived
#全局定义
global_defs {
    # keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTP,也可配置邮件发送
   router_id 192.168.113.138
}
#检测脚本配置
vrrp_script chk_nginx {
    #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
    script "/usr/local/src/checkNginxState.sh" 
    interval 2 #检测时间间隔
    weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state MASTER #来决定主从
    interface eth3 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
    virtual_router_id 100 # 虚拟路由的 ID 号, 两个节点设置必须一样
    mcast_src_ip 192.168.113.138 #填写本机ip
    priority 100 # 节点优先级,主要比从节点优先级高
    nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 将 track_script 块加入 instance 配置块
    track_script {
        chk_nginx #执行 Nginx 监控的服务
    }

    virtual_ipaddress {
           # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
        192.168.113.100 
    }
}



nginx_backup
vim /etc/keepalived/keepalived.conf

配置文件内容如下:
! Configuration File for keepalived
#全局定义
global_defs {
    # keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTP,也可配置邮件发送
   router_id 192.168.113.139
}
#检测脚本配置
vrrp_script chk_nginx {
    #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
    script "/usr/local/src/checkNginxState.sh" 
    interval 2 #检测时间间隔
    weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state BACKUP #来决定主从
    interface eth3 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
    virtual_router_id 100 # 虚拟路由的 ID 号, 两个节点设置必须一样
    mcast_src_ip 192.168.113.139 #填写本机ip
    priority 90 # 节点优先级,主要比从节点优先级高
    nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 将 track_script 块加入 instance 配置块
    track_script {
        chk_nginx #执行 Nginx 监控的服务
    }

    virtual_ipaddress {
           # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
        192.168.113.100 
    }
}

步骤6:修改nginx_master和nginx_backup中的nginx配置文件

将server块中的server_name指向虚拟ip
 server{
        listen 80;
        server_name 192.168.113.100;
}

步骤7:分别启动nginx_master和nginx_backup中的nginx和keepalived

启动nginx
cd /usr/local/nginx/sbin
./nginx

启动keepalived
service keepalived start

步骤8:测试

第一步:在浏览器中输入192.168.113.100访问nginx可以成功;
第二步:将nginx_master中的nginx关闭(./nginx -s stop),重新打开浏览器通过192.168.113.100访问nginx,还是可以成功访问,代表此时nginx服务由nginx_backup提供;
第三步:将nginx_backup中的nginx关闭(./nginx -s stop),重新打开浏览器通过192.168.113.100访问nginx,此时无法访问,因为nginx_master和nginx_backup都没有向外提供nginx服务;