Nginx 入门(超级详细)


tags:

  • Nginx
  • Keepalived
  • 快速使用
  • 框架整合
  • 反向代理服务器
  • 环境搭建
  • 后台资料

Ⅰ Nginx 基本概念


一、Nginx 是什么?


  • Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好。
  • Nginx 转为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能承受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。

Nginx 作为 HTTP 服务器,有以下几项基本特性:

  • 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。
  • 无缓存的反向代理加速,简单的负载均衡和容错。
  • FastCGI,简单的负载均衡和容错。
  • 模块化的结构。包括 gzipping,byte ranges,chunked responses,以及 SSI-filter 等 filter。如果由 FastCGI 或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要互相等待。
  • 支持 SSL 和 TLSSNI。

Nginx 特点:

  • Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率。它支持内核 Poll 模型,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。
  • Nginx 具有很高的稳定性,其它 HTTP 服务器,当遇到访问的峰值,或有人恶意发起慢速连接时,也很有可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。例如当前 apache 一旦遇到 200 个以上进程,web 响应速度就明显非常缓慢了。而 Nginx 采用了分阶段资源分配技术,使得它的 CPU 与内存占用率非常低。Nginx 官方表示保持 10,000 个没有活动的连接,他只占用 2.5M 内存,所以类似 DOS 这样的攻击对 Nginx 来说基本上是毫无用处的。就稳定性而言,Nginx 比 Lighthttpd 更胜一筹。
  • Nginx 支持热部署,他的启动特别容易,并且几乎可以做到 7*24 不间断运行,及试运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行升级。
  • Nginx 采用 master-slave 模型,能够充分利用 SMP 的优势,且能够减少工作进程在磁盘 I/O 的阻塞延迟。当采用 select() / poll() 调用时,还可以限制每个进程的连接数。
  • Nginx 代码质量非常高,代码很规范,手法成熟,模块扩展也很容易。特别值得一提的是强大的 Upstream 与 Filter 链。Upstream 为诸如 reverse proxy,与其他服务器通信模块的编写奠定了很好的基础。而 Filter 链最酷的部分就是各个 filter 不必等待其一个 filter 执行完毕。它可以把前一个 filter 的输出作为当前 filter 的输入,这有点像 Unix 的管线。这意味着,一个模块可以开始压缩从后端服务器发送过来的请求,且可以在模块接收完后端服务器的整个请求之前把压缩流转向客户端。
  • Nginx 采用了一些 OS 提供的最新特性,如对 sendfile(Linux2.2+),accept-filter(FreeBSD4.1+),TCP_DEFER_ACCEPT(Linux2.4+)的支持,从而大大提高了性能。

二、 什么是反向代理?


  1. 正向代理

    用户知道目标服务器地址,但由于网络限制等原因,无法直接访问。这是需要先连接代理服务器,然后再由代理服务器访问目标服务器。

    直接暴露服务器 IP 让客户端进行访问。

  2. 反向代理

    反向代理对用户则是不可知的,代理服务器给我们转发请求到他们 N 多的服务器节点中的一个给我们进行搜索后将结果返回

    隐藏服务器 IP ,暴露代理服务器 IP 让客户端访问。

三、什么是负载均衡?


  • 单个服务器解决不了,增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。

四、什么是动静分离?


  • 为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

Ⅱ Nginx 安装、常用命令和配置文件


一、 Liunx 系统中安装 Nginx


1 安装 Nginx 所需依赖
  • 使用yum 命令一键安装 Nginx 所需依赖

    • pcre
    • openssl
    • zlib
    yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
    
  • 检查安装所需依赖

    pcre-config --version
    
2 安装 Nginx
  • 使用 yum 命令一键安装 Nginx

    yum -y install nginx
    
  • 安装后检查安装是否无误

    whereis nginx
    
  • 运行 nginx

    cd /usr/sbin/
    
    ./nginx
    
  • 查看是否存在 nginx 线程

    ps -ef | grep nginx
    
  • CentOS 防火墙开启 80 端口

    firewall-cmd --permanent --add-port=80/tcp
    
    firewall-cmd --reload
    
  • 根据 ip 访问 80 端口结果为下图所示;则为安装成功

二、Nginx 常用命令


TIP:

使用 nginx 操作命令必须进入 nginx 的目录!

cd /etc/nginx/sbin/
查看 nginx 版本号
./nginx -v
启动 nginx
./nginx
关闭 nginx
./nginx -s stop
重新加载 nginx
./nginx -s reload
卸载 nginx
  • 先停止 nginx

    service nginx stop
    
  • 关闭自启动

    chkconfig nginx off
    
  • 查看相关文件

    whereis nginx
    
  • 删除相关文件

    rm -rf xxxxx
    
  • 卸载

    yum remove nginx
    
  • 检查是否还有残留,有的话执行步骤3继续删除

    whereis nginx
    
常见错误
  • 错误

    nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory)
    
  • 解决方案

    在你的 nginx.conf 所在文件夹下输入

    nginx -c /etc/nginx/nginx.conf
    

    如果输入后出现

    [root@192 nginx]# nginx -c /etc/nginx/nginx.conf
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] still could not bind()
    
    • 根据 nginx 配置文件查看配置的端口(这里使用80),然后根据端口查看端口占用情况

      netstat -ntlp|grep 80
      
      [root@192 nginx]# netstat -ntlp|grep 80
      tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      14458/nginx: master
      
    • 使用 kill 命令杀死占用进程

      kill 14458
      
    • 或者使用 pkill 指令杀死所有 nginx 相关端口

      pkill -9 nginx
      
    • 再次启动 nginx 即可

      nginx -c /etc/nginx/nginx.conf
      

三、Nginx 配置文件


1. 配置文件的位置
cd /etc/nginx/

TIP:

当然,安装方式不同,配置文件位置也可能会发生改变

2. 配置文件组成

nginx 配置文件结构图

  • mian(全局设置)

    mian 块设置的指令将影响其他所有配置。

  • server(主机设置)

    server 块的指令主要用于指定主机和端口。

  • upstream(负载均衡服务器设置)

    upstream 指令主要用于负载均衡,设置一系列的后端服务器。

  • location(URL 匹配特定位置的设置)

    location 块用于匹配网页位置。

这四者之间的关系式:

  • server 继承 main
  • location 继承 server
  • upstream 既不会继承其他设置也不会被继承。
3. 全局配置
  • 代码如下:

    user nobody nobody;
    worker_processes 2;
    error_log logs/error.log notice;
    pid logs/nginx.pid;
    worker_rlimit_nofile 65535;
     
    events{
    use epoll;
    worker_connections 65536;
    }
    
  • 每个配置选项的含义解释如下:

    • user

      主模块指令,指定 nginx worker 进程运行用户以及用户组,默认由 nobody 账号运行。

    • worker_processes

      主模块指令,指定 nginx 要开启的进程数。每个 nginx 进程平均耗费 10M ~ 12M 内存。建议指定和 CPU 的数量一致即可。

    • error_log

      主模块指令,用来定义全局错误日志文件。日志输出级别有 debug、info、notice、warn、error、crit 可供选择,其中,debug 输出日志最为详细,而 crit 输出日志最少。

    • pid

      主模块指令,用来指定进程 pid 的存储文件位置。

    • worker_rlimit_nofile

      用于绑定 worker 进程和 CPU,Linux 内核 2.4 以上可用。

  • events 事件指令是设定 nginx 的工作模式及连接数上限

    • use

      事件模块指令,用来指定 nginx 的工作模式。nginx 支持的工作模式有:

      • select

        标准的工作模式

      • poll

        标准的工作模式

      • kqueue

        高效的工作模式,用在 BSD 系统中

      • epoll

        高效的工作模式,用在 Linux 平台上,对于 Linux 系统,epoll 工作模式是首选

      • rtsig

      • /dev/poll

    • worker_connections

      事件模块指令,用于定义 nginx 每个进程的最大连接数,默认是 1024.最大客户端连接数由 worker_processes * worker_connections 决定,即 Max_client = worker_processes * worker_connections。

      在作为反向代理时,Max_client 变为 :Max_client = worker_processes * worker_connections / 4。进程的最大连接数受 Linux 系统进程的最大打开文件数限制,在执行操作系统命令 ulimit -n 65536 后 worker_connections 的设置才能生效。

4. HTTP 服务器配置
  • 代码如下:

    
    http{
    include conf/mime.types;
    default_type application/octet-stream;
    log_format main '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$gzip_ratio"';
    log_format download '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$http_range" "$sent_http_content_range"';
    client_max_body_size 20m;
    client_header_buffer_size 32K;
    large_client_header_buffers 4 32k;
    Sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 60;
    client_header_timeout 10;
    client_body_timeout 10;
    send_timeout 10;
    
  • 每个配置选项的含义解释如下

    • include

      主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。类似于 Apache 中的 include 方法。

    • default_type

      HTTP 核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置 PHP 环境时,nginx 是不给予解析的,此时,用浏览器访问 PHP 文件就会出现下载窗口。

  • 下面的代码实现对日志格式的设定:

    log_format main '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$gzip_ratio"';
    log_format download '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$http_range" "$sent_http_content_range"';
    
  • log_format

    nginx 的 HttpLog 模块指令,用于指定 nginx 日志的输出格式。main 为此日志输出格式的名称,可以在下面的 access_log 指令中引用。

    • client_max_body_size

      用来设置允许客户端请求的最大的单个文件字节数;

    • client_header_buffer_size

      用于指定来自客户端请求头的 headerbuffer 大小。对于大多数请求,1K 的缓冲区大小已经足够了,如果自定义了消息头或有更大的 Cookie,可以增加缓冲区大小。这里设置为 32K;

    • large_client_header_buffers

      用来指定客户端请求中较大的消息头的缓存最大数量和大小,4 为个数,128K 为大小,最大缓存量为 4 个 128K;

    • sendfile

      参数用于开启高效文件传输模式。将 tcp_nopush 和 tcp_nodelay 两个指令设置为 no 用于防止网络阻塞;

    • keepalive_timeout

      设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接;

    • client_header_timeout

      设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,nginx 将返回 Request time out (408) 错误;

    • client_body_timeout

      设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,nginx 将返回 Request time out (408) 错误;

    • send_timeout

      指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx 将会关闭连接。

5. HttpGzip 模块配置
  • 该模块支持在线实时压缩输出数据流。首先需要通过以下命令查看是否安装 HttpGzip 模块:

    [root@vps ~]# nginx -v
    nginx version: nginx/1.0.14
    built by gcc 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)
    configure arguments: --with-http_stub_status_module --with-http_gzip_static_module --prefix=/opt/nginx
    

    通过 nginx -v 命令可以查看安装 nginx 时的编译选项,由输出可知,我们已经安装了 HttpGzip 模块。

  • 下面是 HttpGzip 模块在 nginx 配置中的相关属性设置

    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css application/xml;
    
    • gzip

      用于设置开启或关闭 gzip 模块,gzip on 表示开启 GZIP 压缩,实时压缩输出数据流;

    • gzip_min_length

      设置允许压缩的页面最小字节数,页面字节数从 header 头的 Content_Length 中获取。默认值是 0 ,不管页面多大都进行压缩。建议设置成 1K 的字节数,小于 1K 可能会越压越大;

    • gzip_buffers

      表示申请 4 个单位为 16K 的内存作为压缩流缓存,默认值是申请与原始数据大小相同的内存空间来储存 gzip 压缩结果;

    • gzip_http_version

      用于设置识别 HTTP 协议版本,默认是 1.1,目前大部分浏览器已经支持 GZIP 压缩,使用默认即可;

    • gzip_comp_level

      用来指定 GZIP 压缩比, 1 压缩比最小,处理速度最快;9压缩比最大,传出速度快,但处理很慢,也比较消耗 cpu 资源;

    • gzip_types

      用来指定压缩的类型,无论是否指定,text/html 类型总是会被压缩;

    • gzip_vary

      可以让前端的缓存服务器缓存经过 GZIP 压缩的页面,例如用 Squid 缓存经过 nginx 压缩的数据。

6. 负载均衡配置
  • 下面设定负载均衡服务器列表:

    upstream cszhi.com{
    ip_hash;
    server 192.168.8.11:80;
    server 192.168.8.12:80 down;
    server 192.168.8.13:8009 max_fails=3 fail_timeout=20s;
    server 192.168.8.146:8080;
    }
    
  • upstream 是 nginx 的 HTTP Upstream 模块,这个模块通过一个简单的调度算法来实现客户端 IP 到后端服务器的负载均衡。

  • 在上面的设定中,通过 upstream 指令制定了一个负载均衡器的名称 cszhi.com 。这个名称可以任意指定,在后面需要的地方直接调用即可。

  • nginx 的负载均衡模块目前支持五种调度算法,下面进行分别介绍,其中后两项属于第三方调度方法:

    • 轮询(默认)

      每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响;

    • Weight

      指定轮询权值,Weight 值越大,分配的访问机率越高,主要用于后端每个服务器性能不均的情况下;

    • ip_hash

      每个请求按访问 IP 的 hash 结果分配,这样来自同一个 IP 的访客固定访问一个后端服务器,有效的解决了动态页面存在的 session 共享问题;

    • fair

      比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后台服务器的响应时间来分配请求,响应时间短的优先分配。nginx 本身是不支持 fair 的,如果需要这种调度算法,必须下载 nginx 的 upstream_fair 模块;

    • url_hash

      按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。nginx 本身是不支持 url_hash 的,如果需要使用这种调度算法,必须安装 nginx 的 hash 软件包。

  • 在 HTTP Upstream 模块中,可以通过 server 指令指定后端服务器的 IP 地址和端口,同时还可以设定每个后台服务器在负载均衡调度中的状态。常用的状态有:

    • down

      表示当前的 server 暂时不参与负载均衡;

    • backup

      预留的备份机器。当其他所有的非 backup 机器出现故障或者忙的时候,才会请求 backup 机器,因此这台机器的压力最轻;

    • max_fails

      允许请求失败的次数,默认为 1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误;

    • fail_timeout

      在经历了 max_fails 此失败后,暂停服务器的时间。max_fails 可以和 fail_timeout 一起使用。

  • **注意!**当负载均衡调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能是 weight 和 backup。

7. server 虚拟主机配置
  • 下面介绍对虚拟主机的配置:

  • 建议将对虚拟主机进行配置的内容写进另外一个文件,然后通过 include 指令包含进来,这样便于维护和管理。

    server{
    listen 80;
    server_name 192.168.8.18 cszhi.com;
    index index.html index.htm index.php;
    root /wwwroot/www.cszhi.com
    charset gb2312;
    access_log logs/www.ixdba.net.access.log main;
    
    • server

      标志定义虚拟主机开始;

    • listen

      用于指定虚拟机的服务器端口;

    • server_name

      用来指定 IP 地址或者域名,多个域名之间用空格分开;

    • index

      用于设定访问的默认首页地址;

    • root

      用于指定虚拟机主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径;

    • Charset

      用于设置网页的默认编码格式;

    • access_log

      用来指定此虚拟主机的访问日志存放路径;

    • main

      用于指定访问支持的输出格式。

8. location URL 匹配配置
  • URL 地址匹配是进行 nginx 配置中最灵活的部分。location 支持正则表达式匹配,也支持判断条件匹配,用户通过 location 指令实现 nginx 对动、静态网页进行过滤处理。使用 location URL 匹配配置还可以实现反向代理,用于实现 PHP 动态解析或者负载均衡。

  • 以下这段设置是通过 location 指令来对网页 URL 进行分析处理,所有扩展名,以 .gif、.jpg、.jpeg、.png、.bmp、.swf 结尾的静态文件都交给 nginx 处理,而 expires 用来指定静态文件的过期时间,这里是 30天。

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    root /wwwroot/www.cszhi.com;
    expires 30d;
    }
    
  • 以下这段设置是将 upload 和 html 下的所有文件都交给 nginx 来处理,当然,upload 和 html 目录包含在 /web/wwwroot/www.cszhi.com 目录中。

    location ~ ^/(upload|html)/ {
    root /web/wwwroot/www.cszhi.com;
    expires 30d;
    }
    
  • 最后这段设置中,location 是对此虚拟主机下动态网页的过滤处理,也就是将所有以 .jsp 为后缀的文件都交给本机的 8080 端口处理。

    location ~ .*.php$ {
    index index.php;
    proxy_pass http://localhost:8080;
    }
    
9. Stub Status 模块配置
  • StubStatus 模块能够获取 nginx 自上次启动以来的工作状态,此模块非核心模块,需要在 nginx 编译安装时手工指定才能使用此功能。

  • 以下指令实现指定启用获取 nginx 工作状态功能:

    location /NginxStatus {
    stub_status on;
    access_log logs/NginxStatus.log;
    auth_basic "NginxStatus";
    auth_basic_user_file ../htpasswd;
    }
    
    • stub_status

      设置为 on 表示启用 StubStatus 的工作状态统计功能;

    • access_log

      用来指定 StubStatus 模块的访问日志文件;

    • auth_basic

      是 nginx 的一种认证机制;

    • auth_basic_user_file

      用来指定认证的密码文件,由于 nginx 的 auth_basic 认证采用的是与 Apache 兼容的密码文件,因此需要用 Apache 的和 htpasswd 命令来生成密码文件,例如要添加一个 test 用户,可以使用下面方式生成密码文件:

      /usr/local/apache/bin/htpasswd -c  /opt/nginx/conf/htpasswd test
      

      然后输入两次密码后确认之后添加用户成功。

  • 要查看 nginx 的运行状态,可以输出 http://ip/NginxStatus,输入创建的用户名和密码就可以看到 nginx 的运行状态:

    Active connections: 1
    server accepts handled requests
    34561 35731 354399
    Reading: 0 Writing: 3 Waiting: 0
    
    • Active connections

      表示当前活跃的连接数;

    • 第三行的三个数字

      nginx 当前总共处理了 34561 个连接,成功创建 35731 此握手,总共处理了 354399 个请求;

    • Reading

      表示 nginx 读取到客户端 Header 信息数;

      • Writing

        表示 nginx 返回给客户端的 Header 信息数;

      • Waiting

        表示 nginx 已经处理完,正在等候下一次请求指令时的驻留连接数;

  • 在最后这段设置中,设置了虚拟主机的错误信息返回页面,通过 error_page 指定可以指定各种错误信息返回的页面。在默认情况下,nginx 会在主目录的 html 目录中查找指定的返回页面,特别需要注意的是,这些错误信息的返回页面大小一定要超过 512K,否则会被 IE 浏览器替换为 IE 默认的错误页面。

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }
    }
    }
    

Ⅲ Nginx 配置实例


反向代理 -1


  • 实现效果

    浏览器地址栏输入 www.test.com 跳转 Liunx 系统中的 tomcat 主页面中

  • 实施步骤

    1. 在 Liunx 系统安装 tomcat ,使用默认端口:8080;

    2. 配置 windows 系统中的 hosts 文件:

      • 打开 cmd 终端输入:C:\Windows\System32\drivers\etc 回车;
      • 右键 hosts 文件点击 属性安全编辑 后选中当前 windows 登录用户、勾选下方 完全修改 选项后应用;
      • 打开 hosts 文件,添加代码:192.168.94.132(替换为自己服务器的 IP) www.test.com,保存;
    3. 配置 nginx.conf

      • 根据自己安装 nginx 的位置找到 nginx.conf 文件;

      • 在 http 块内添加以下代码:

        server {
        	#指定 nginx 监听端口
        	listen 80;
        	#指定服务器地址或域名
        	server_name 192.168.94.32;(替换为自己服务器的 IP)
        	#指定定向页面地址为本机的 tomcat
        	location / {
        		#proxy_pass 为代理转发,这里就是配置代理转发至本机的 8080 端口
        		proxy_pass http://127.0.0.1:8080;
        	}
        }
        

        保存退出;

        输入 nginx -s reload 重新加载 nginx 使配置生效;

      • 输入 firewall-cmd --permanent --add-port=80/tcpfirewall-cmd --permanent --add-port=8080/tcp 开放 80、8080 端口;

      • 输入 firewall-cmd --reload 让配置生效;

  • 测试效果

    在浏览器地址栏输入:www.test.com 效果如下:

    TIP:

    因为博主修改了 tomcat 默认主页面,所以呈现效果跟大家所测试的可能会不一样,只要是成功访问到了 Linux 系统中的 tomcat 就可以了。

反向代理 -2


  • 实现效果

    • 浏览器地址栏输入 http://192.168.94.132:9001/one/one.html 跳转 Liunx 系统中的 tomcatA http://127.0.0.1:8080
    • 浏览器地址栏输入 http://192.168.94.132:9001/two/two.html 跳转 Liunx 系统中的 tomcatB http://127.0.0.1:8081
  • 实施步骤

    1. 准备两个 tomcat ,端口分别设置为 8080、8081;

    2. 分别在两个 tomcat 的 webapps 里添加文件夹:

      • tomcatA:/webapps/one/
      • tomcatB:/webapps/two/
    3. 分别在两个 tomcat 的新建的文件夹里添加任意可区分页面:

      • tomcatA:/webapps/one/one.html
      • tomcatB:/webapps/two/two.html
    4. 配置 nginx.conf

      • 根据自己安装 nginx 的位置找到 nginx.conf 文件;

      • 在 http 块内添加以下代码:

        server {
        	#指定 nginx 监听端口
        	listen 9001;
        	#指定服务器地址或域名
        	server_name 192.168.94.132;(替换为自己服务器的 IP)
        	#如果路径中存在 /one/ 则定向为 8080 端口
        	location ~ /one/ {
        		proxy_pass http://127.0.0.1:8080;
        	}
        	#如果路径中存在 /two/ 则定向为 8081 端口
        	location ~ /two/ {
        		proxy_pass http://127.0.0.1:8081;
        	}
        }
        

        保存退出;

        输入 nginx -s reload 重新加载 nginx 使配置生效;

      • 输入 firewall-cmd --permanent --add-port=9001/tcpfirewall-cmd --permanent --add-port=8080/tcpfirewall-cmd --permanent --add-port=8081/tcp 开放 9001、8080、8081 端口;

      • 输入 firewall-cmd --reload 让配置生效;

  • 测试效果

    • 在浏览器地址栏输入:http://192.168.94.132:9001/one/one.html 效果如下:

    • 在浏览器地址栏输入:http://192.168.94.132:9001/two/two.html 效果如下:

负载均衡


  • 实现效果

    在浏览器地址栏输入 http://192.168.94.132/test/test.html,负载均衡效果,平均 8080 和 8081 端口中;

  • 实施步骤

    1. 准备两个 tomcat ,端口分别设置为 8080、8081;

    2. 分别在两个 tomcat 的 webapps 里添加文件夹:

      • tomcatA:/webapps/test/
      • tomcatB:/webapps/test/
    3. 分别在两个 tomcat 的新建的文件夹里添加任意可区分页面:

      • tomcatA:/webapps/test/test.html
      • tomcatB:/webapps/test/test.html
    4. 配置 nginx.conf

      • 配置一个负载均衡规则:

        http {
        ......
        	upstream testserver{
        		server 192.168.94.132:8080;
        		server 192.168.94.132:8081;
        	}
        ......
        }
        
      • 配置一个匹配路径规则:

        http {
        ......
        	upstream .....
        	server{
        		listen 80;
        		server_name 192.168.94.132;
        		location / {
        			proxy_pass http://testserver;
        		}
        	}
        ......
        }
        

        保存退出;

        输入 nginx -s reload 重新加载 nginx 使配置生效;

      • 输入 firewall-cmd --permanent --add-port=9001/tcpfirewall-cmd --permanent --add-port=8080/tcpfirewall-cmd --permanent --add-port=8081/tcp 开放 9001、8080、8081 端口;

      • 输入 firewall-cmd --reload 让配置生效;

  • 测试效果

    打开两个浏览器地址栏全部访问:http://192.168.94.132:9001/one/one.html,效果如下:

    • 浏览器A:

    • 浏览器B:

  • nginx 部分分配服务器策略

    1. 轮询(默认)

      • 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除;
    2. weight

      • weight 代表权重,默认为1,权重越高,被分配的客户端越多;

      • 使用方法:

        upstream testserver{
        	server 192.168.94.132:8080 weight=10;
        	server 192.168.94.132:8081 weight=10;
        }
        
    3. ip_hash

      • 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题;

      • 使用方法:

        upstream testserver{
        	ip_hash
        	server 192.168.94.132:8080;
        	server 192.168.94.132:8081;
        }
        
    4. fair(第三方)

      • 按后端服务器的响应时间来分配请求,响应时间短的优先分配;

      • 使用方法:

        upstream testserver{
        	server 192.168.94.132:8080;
        	server 192.168.94.132:8081;
        	fair;
        }
        

动静分离


  • 实现效果

    在浏览器地址栏输入 http://192.168.94.132/www/www.html 访问到静态页面;

    输入 http://192.168.94.132/images/L-002.jpg 访问到静态图片资源;

  • 实施步骤

    1. 在 Liunx 系统根目录下创建 data 文件夹;

    2. 在刚刚创建的 data 文件夹中分别创建 wwwimages 用来存放资源

    3. www 文件夹下创建一个名为 www.html 的网页资源;

    4. images 文件夹下创建一个名为 L-002.jpg 的图片资源;

    5. 配置 nginx.conf

      • 找到监听 80 端口的 server 并书写新的 location:

        server {
        	listen	80;
        	server_name	192.168.94.132;
        	
        	location /www/ {
        		root /data/;
        		index index.html index.htm;
        	}
        	
        	location /images/ {
        		root /data/;
        		autoindex on;
        	}
        }
        

        保存退出;

        输入 nginx -s reload 重新加载 nginx 使配置生效;

      • 输入 firewall-cmd --permanent --add-port=9001/tcpfirewall-cmd --permanent --add-port=8080/tcpfirewall-cmd --permanent --add-port=8081/tcp 开放 9001、8080、8081 端口;

      • 输入 firewall-cmd --reload 让配置生效;

  • 测试效果

    • 在浏览器地址栏输入:http://192.168.94.132/www/www.html

    • 在浏览器地址栏输入:http://192.168.94.132/images/L-002.jpg

配置高可用集群


  • **问题:**如果程序在运行过程中 nginx 宕机,我们的请求将无法实现效果;

  • **解决方案:**配置高可用的 nginx 集群

  • **什么叫高可用:**即使我们的其中一个 nginx 宕机,我们的请求依然可以实现效果;

  • 实现效果

    在过程中需要用到一个软件:keepalived;keepalived 相当于一个路由,他会检测你的Master服务器的运行状态,如果你的Master服务器还活着,就继续进行访问,如果挂掉则会切换到 Backup 服务器中;

    因为两台服务器的 IP 不同,所以我们需要一个 虚拟IP,类似于注册一个网卡

    1. 需要两台 nginx 服务器;
    2. 需要 keepalived;
    3. 需要虚拟的 ip 地址
  • 实施步骤

    1. 需要两台服务器:192.168.94.132 和 192.168.94.136;

    2. 两台服务器安装 nginx;

    3. 两台服务器安装 keepalived;

      • 安装

        yum install keepalived -y
        
      • 检查安装

        rpm -q -a keepalived
        
    4. 完成高可用配置

      • 修改 /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 192.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 改为 BACKUP       
        interface ens33  //网卡
        virtual_router_id 51   # 主、备机的 virtual_router_id 必须相同
        priority 90     # 主、备机取不同的优先级,主机值较大,备份机值较小 
            advert_int 1
                authentication { 
                auth_type PASS 
                auth_pass 1111 
            } 
            virtual_ipaddress {
            192.168.94.100 // VRRP H 虚拟地址 
            } 
        } 
        
      • 在 /usr/local/src 添加检测脚本

        #!/bin/bash
        A=`ps -C nginx –no-header |wc -l`
        if [ $A -eq 0 ];then
        	/usr/sbin/nginx
        	sleep 2
        	if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        		killall keepalived
        	fi
        fi 
        

        对应 keepalived.conf 中的

        vrrp_script chk_http_port { 
          
           script "/usr/local/src/nginx_check.sh" 
             interval 2      #(检测脚本执行的间隔) 
          
           weight 2 
          
        } 
        
      • 把两台服务器上的 nginx 和 keepalived 启动

        • 启动 nginx

          ./nginx
          
        • 启动 keepalived

          systemctl start keepalived.service
          
        • 重新加载 keepalived 配置文件

          kill -HUP $(cat /var/run/keepalived.pid)
          
  • 测试效果

    • 在 MASTER 服务器输入:ip a指令,查看是否开启虚拟IP成功

    • 在浏览器地址栏输入虚拟 ip 地址:192.168.94.100

    • 之后再把 MASTER(192.168.94.132)nginx 停掉,再次在浏览器地址栏输入:192.168.94.100

  • 完成;

  • 13
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值