应用架构之【Nginx+Keepalived】Web 集群方案

Nginx 是一个开源(遵循 BSD 协议)、高性能、高可靠的 Web 和反向代理服务器。主要用于 Web 应用的缓存和负载均衡,支持热部署、占用内存少、并发能力强,能支持高达 5w 个并发连接数。

Nginx 主要应用场景包括:
1、静态资源(静态 HTML 网站、文件、图片、音视频)的 Web 服务器;
2、Web 应用和服务的反向代理(负载均衡、缓存)服务器。

Keepalived是一个开源(遵循 GPLv2 协议)的、基于 VRRP 协议的轻量级服务高可用和负载均衡方案,提供避免服务器单点故障和请求分流的能力。它为 Nginx 扩展了高可用能力,共同组成完整的 Web 服务集群模式(高可用+负载均衡)。

目录

1.集群部署拓扑图

2.Web 应用服务器部署

3.Nginx 代理服务器的安装和配置

4.Keepalived 高可用中间件的安装和配置

附录一 Nginx 配置文件详解

附录二 Nginx 配置虚拟主机头

附录三 扩展 Nginx 客户端身份认证

附录四 扩展 Nginx 跨域访问

附录五 扩展 Nginx 网页压缩

附录六 Nginx 四层网络协议负载均衡


1.集群部署拓扑图

Web应用集群部署拓扑图

网络资源规划:

1、Web 应用服务器节点

节点名 主机名 IP:PORT 程序 操作系统
Web 集群节点-1 Web-1 192.168.216.1:80 Python HttpServer CentOS8
Web 集群节点-2 Web-2 192.168.216.2:80 Python HttpServer CentOS8
Web 集群节点≥3 Web-3 192.168.216.3:80 Python HttpServer CentOS8

2、Nginx 高可用服务器节点

节点名 主机名 IP:PORT 程序 操作系统
Nginx 集群节点-1 Proxy-1 192.168.216.128:80 / 112 Nginx / Keepalived CentOS8
Nginx 集群节点≥2 Proxy-2 192.168.216.129:80 / 112 Nginx / Keepalived CentOS8

Keepalived Virtual IP:192.168.216.130。


2.Web 应用服务器部署

Web 应用服务器可以使用任何中间件部署 WebSite 、WebApp 或者是通过 Http 协议提供服务的资源。需要注意的是:作为 Web 负载均衡的节点,发布的服务通常需要具备完全一致性,包括但不限于:数据源一致性、程序一致性、配置一致性。

常见的 Web 开源中间件:

产品 独立部署 SpringBoot 嵌入 静态资源 静态站点 JavaWeb SSL
Tomcat
Undertow ×
Jetty ×
Nginx × ×
Apache Httpd × ×
Python HttpServer × × ×

本例采用 Python HttpServer 搭建静态站点的演示环境。

在各个 "Web 应用服务器节点" (Web-1、Web-2、Web-3)上制作、发布静态站点。以节点 "Web-1" 为例:

1、在用户主目录下创建静态站点。

使用文本编辑器创建 HTML 文件:

[centos@Web-1 ~ ]$ mkdir website
[centos@Web-1 ~ ]$ gedit ~/website/index.html

在文件中编写以下内容并保存:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>website-1</title>
  </head>
  <body>
    【Nginx+Keepalived】Web 集群演示
  </body>
</html>

注意: 为了演示 Nginx 负载均衡特性,"<title />"中定义各个站点的标识,三个 Web 站点依次为:"website-1"、"website-2"、"website-3";"<body />"中定义的内容必须一致,体现发布服务的一致性。

2、进入静态站点目录并发布站点。

[centos@Web-1 ~ ]$ cd website
[centos@Web-1 website ]$ sudo python3 -m http.server 80

3、设置防火墙端口(CentOS8默认安装firewall防火墙),允许"80"端口访问服务器。

[centos@Web-1 ~ ]$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
[centos@Web-1 ~ ]$ sudo firewall-cmd --reload

4、使用浏览器访问 Web 服务。

Web 服务测试页面

注意:其他 "Web 应用服务器节点" 全部需要按照以上步骤配置。


3.Nginx 代理服务器的安装和配置

在各个 "Proxy 集群节点" (Proxy-1、Proxy-2)安装、配置 Nginx,以 "Proxy-1" 为例:

1、打开 Nginx 下载页面【http://nginx.org/en/download.html】,下载 Nginx 的源代码 tar.gz 包到用户主目录中。

Nginx 下载页面

2、验证并安装依赖软件。通过源代码编译的方式安装 Nginx,需要依赖软件"make"、"gcc"、"pcre"、"pcre-devel"、"zlib"、"zlib-devel"、"openssl"、"openssl-devel",验证或安装依赖软件。

[centos@Proxy-1 ~]$ sudo dnf install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

补充知识:

① "gcc"是一个C/C++、FORTRAN、JAVA、OBJC、ADA等多种语言的编译器,用来将源代码编译成可发布的软件程序。

② "make"是一个工程管理工具,能够根据 Makefile 中的脚本执行编译、安装流程。

③ "pcre"是一个正则表达式函数库;"pcre-devel"是它的开发库。

④ "zlib"是一个数据压缩函数库;"zib-devel"是它的开发库。

⑤ "openssl"是一个实现安全通信,避免窃听,同时确认另一端连接者身份的软件程序;"openssl-devel"是它的开发库。

3、解压缩 Nginx 的源代码 tar 包到用户主目录下。

[centos@Proxy-1 ~]$ tar -zxvf nginx-1.18.0.tar.gz
[centos@Proxy-1 ~]$ ll
drwxr-xr-x.  8 centos centos    4096 4月  21 22:09 nginx-1.18.0

4、安装 Nginx,进入源代码目录,配置、编译、安装程序。

[centos@Proxy-1 ~]$ cd nginx-1.18.0
[centos@Proxy-1 nginx-1.18.0]$ ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module  --with-stream
Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/nginx/sbin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

[centos@Proxy-1 nginx-1.18.0]$ make
[centos@Proxy-1 nginx-1.18.0]$ sudo make install

[centos@Proxy-1 ~]$ ll /usr/local/nginx
drwxr-xr-x. 2 root root 4096 5月  18 09:39 conf
drwxr-xr-x. 2 root root   40 5月  18 09:39 html
drwxr-xr-x. 2 root root    6 5月  18 09:39 logs
drwxr-xr-x. 2 root root   19 5月  18 09:39 sbin

程序安装目录是"/usr/local/nginx"。

5、设置 Nginx 配置文件参数。

使用文本编辑器打开配置文件:

[centos@Proxy-1 ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf

修改或验证文件中的以下参数并保存(七层代理):

http {
    
    # 负载均衡
    upstream website {
        server 192.168.216.1:80 weight=1;
        server 192.168.216.2:80 weight=1;
        server 192.168.216.3:80 weight=1;
    }
    
    server {
        # 监听端口
        listen       80;
        
        # 服务器域名(主机头)
        server_name  localhost;

        # 代理 Web 服务的 Url 前缀,一般是 Web 服务的虚拟目录(可以是正则表达式)。
        location / {
            proxy_pass http://website;
        }
    }
}

在文件中追加以下参数并保存(四层代理):

stream {
    
    # 负载均衡
    upstream website {
        server 192.168.216.1:80 weight=1;
        server 192.168.216.2:80 weight=1;
        server 192.168.216.3:80 weight=1;
    }
    
    server {
        # 监听端口
        listen       80;
        
        # 代理服务位置
        proxy_pass website;
    }
}

注意:两种方案二选一即可。

Web 代理一般使用七层协议代理,以便于实现主机头等站点路由功能;
四层协议可用于 Web 代理以外的负载均衡场景,如:MySQL 数据库只读连接等。

6、配置 Nginx 开机自启动。

使用文本编辑器创建配置文件:

[centos@Proxy-1 ~ ]$ sudo gedit /usr/lib/systemd/system/nginx.service

编写文件内容并保存如下:

[Unit]
Description=Nginx
After=syslog.target network.target

[Service]
Type=forking
User=root
Group=root

ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

设置开机启动:

[centos@Proxy-1 ~ ]$ sudo systemctl daemon-reload
[centos@Proxy-1 ~ ]$ sudo systemctl enable nginx.service

7、启动 Nginx 服务。

[centos@Proxy-1 ~ ]$ sudo systemctl start nginx.service

8、设置防火墙端口(CentOS8默认安装firewall防火墙),允许"80"端口(Nginx 默认端口)访问服务器。

[centos@Proxy-1 ~ ]$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
[centos@Proxy-1 ~ ]$ sudo firewall-cmd --reload

注意:其他 "Proxy 集群节点" 全部需要按照以上步骤配置。

9、Nginx 运维管理。

1)启动 Nginx 服务(任选一种方式)

[centos@Proxy-1 ~ ]$ sudo systemctl start nginx.service

或者

[centos@Proxy-1 ~ ]$ sudo -u /usr/local/nginx/sbin/nginx

2)停止 Nginx 服务(任选一种方式)

[centos@Proxy-1 ~ ]$ sudo systemctl stop nginx.service

或者

[centos@Proxy-1 ~ ]$ /usr/local/nginx/sbin/nginx -s quit

3)重启 Nginx 服务

[centos@Proxy-1 ~ ]$ sudo systemctl restart nginx.service

或者

[centos@Proxy-1 ~ ]$ /usr/local/nginx/sbin/nginx -s reload

4)查看 Nginx 服务状态

[centos@Proxy-1 ~ ]$ sudo systemctl status nginx.service

或者

[centos@Proxy-1 ~ ]$ sudo ps -ef | grep nginx
root     119777      1  0 10:16 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx

[centos@Proxy-1 ~ ]$ sudo netstat -ntap | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      119777/nginx: maste

[centos@Proxy-1 ~ ]$ sudo tail /usr/local/nginx/logs/error.log
[centos@Proxy-1 ~ ]$ sudo tail /usr/local/nginx/logs/access.log

5)启用 Nginx 服务开机自启动

[centos@Proxy-1 ~ ]$ sudo systemctl enable nginx.service

6)禁用 Nginx 服务开机自启动

[centos@Proxy-1 ~ ]$ sudo systemctl disable nginx.service

4.Keepalived 高可用中间件的安装和配置

在各个 "Proxy 集群节点" (Proxy-1、Proxy-2)安装、配置 Keepalived,以 "Proxy-1" 为例:

1、安装 EPEL 的 Yum源。

使用文本编辑器创建仓库配置文件:

[centos@Proxy-1 ~ ]$ sudo gedit /etc/yum.repos.d/epel.repo

在文件中编写以下内容并保存:

[epel-modular]
name=Extra Packages for Enterprise Linux Modular $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/Modular/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8

[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8

更新 Yum 源:

[centos@Proxy-1 ~]$ sudo dnf clean all
[centos@Proxy-1 ~]$ sudo dnf makecache
Extra Packages for Enterprise Linux Modular 8 - 429 kB/s | 118 kB     00:00    
Extra Packages for Enterprise Linux 8 - x86_64  3.7 MB/s | 6.9 MB     00:01    
元数据缓存已建立。

EPEL(Extra Packages for Enterprise Linux)是企业级 Linux 操作系统的扩展包仓库,为 Redhat/CentOS系统提供大量的额外软件包。

2、安装 Keepalived。

[centos@Proxy-1 ~]$ sudo dnf install keepalived

程序安装目录是"/usr/sbin",配置文件目录是"/etc/keepalived"。

3、设置 Keepalived 配置文件参数。

使用文本编辑器打开配置文件:

[centos@Proxy-1 ~ ]$ sudo gedit /etc/keepalived/keepalived.conf

在文件中编写以下内容并保存:

# 定义全局配置
global_defs {
    # 本地节点 ID 标识,一般设置为主机名。
    router_id proxy-1
}

# 定义周期性执行的脚本,脚本的退出状态码会被调用它的所有的 vrrp_instance 记录。
vrrp_script chk_nginx {
    # 执行脚本的路径。
    script "/etc/keepalived/nginx_check.sh"
    # 脚本执行的间隔(单位是秒)。默认为1s。
    interval 2
    # 当脚本调整优先级,从 -254 到 254。默认为2。
    # 1. 如果脚本执行成功(退出状态码为0),weight大于0,则priority增加。
    # 2. 如果脚本执行失败(退出状态码为非0),weight小于0,则priority减少。
    # 3. 其他情况下,priority不变。
    weight -20
    # 当脚本执行超过时长(单位是秒)则被认为执行失败。
    # 运行脚本的用户和组。
    user root root
    # timeout 30
    # 当脚本执行成功到设定次数时,才认为是成功。
    # rise 1
    # 当脚本执行失败到设定次数时,才认为是失败。
    # fall 3
}

# 定义虚拟路由,可以定义多个。
vrrp_instance VI_1 {
    # 本地节点初始状态,包括 MASTER(主节点) 和 BACKUP (备节点)。
    state MASTER
    # 本地节点绑定虚拟 IP 的网络接口。
    interface ens33
    # 本地节点优先级,优先级高的节点将动态变成 MASTER 节点,接管 VIP 。初始状态下,MASTER 节点的优先级必须高于 BACKUP 节点。
    priority 100
    # VRRP 实例 ID,范围是0-255。同一集群的所有节点应设置一致的值。
    virtual_router_id 216
    # 组播信息发送时间间隔。同一集群的所有节点必须设置一样,默认为1秒。
    advert_int 1
    # 设置验证信息。同一集群的所有节点必须一致
    authentication {
        # 指定认证方式。PASS 表示简单密码认证(推荐);AH:IPSEC认证(不推荐)。
        auth_type PASS
        # 指定认证所使用的密码,最多8位。
        auth_pass 1111
    }

    # 声明调用已定义的 vrrp_script 脚本。
    track_script {
        chk_nginx
    }

    # 定义虚拟 IP 地址。
    virtual_ipaddress {
        192.168.216.130
    }
}
# 定义对外提供服务 LVS (负载均衡)的 VIP 和 端口(当端口号设置为【0】时,表示所有端口),只实现高可用时可不配置。
# 注意:本方案中,通过 Nginx 实现 Web 负载均衡,Keepalived 只实现高可用,因此负载均衡既可以不配置,也可以配置成 Nginx 的负载均衡;当没有 Ngxin 时,可以直接配置成 Web 的负载均衡。
virtual_server 192.168.216.130 80 {  
    # 设置健康检查时间,单位是秒
    delay_loop 6 
    #负载均衡调度算法
    lb_algo rr
    # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式    
    lb_kind DR
    # VIP 子网掩码
    nat_mask 255.255.255.0
    # 会话保持时间,一定时间之内用户无响应则下一次用户请求时需重新路由,一般设为0,表示不需要    
    persistence_timeout 0
    # 网络协议
    protocol TCP
    # 定义后端 RealServer 的真实服务器属性,IP 地址和端口(当端口号设置为【0】时,表示所有端口)
    real_server 192.168.216.128 80 { 
        # 配置节点权值,数字越大权重越高 
        weight 1
        TCP_CHECK {  
            connect_timeout 10         
            nb_get_retry 3  
            delay_before_retry 3  
            connect_port 80  
        }  
    }  
    real_server 192.168.216.129 80 {
        weight 1
        TCP_CHECK {  
            connect_timeout 10  
            nb_get_retry 3  
            delay_before_retry 3  
            connect_port 80  
        }  
    }  
}

初始化的主节点和备节点的区别体现在以下参数中:

  • 初始主节点
vrrp_instance VI_1 {
    # 必须设置为 MASTER 。
    state MASTER
    # 必须设置为最大值。
    priority 100
}
  • 初始备节点
vrrp_instance VI_1 {
    # 必须设置为 BACKUP 。
    state BACKUP
    # 必须设置为小于主节点的值。
    priority 90
}

4、创建或编辑 Nginx 检测脚本文件。文件路径对应配置文件中 vrrp_script 的 script 设置值。

使用文本编辑器创建脚本文件:

[centos@Proxy-1 ~ ]$ sudo gedit /etc/keepalived/nginx_check.sh

在脚本文件中编写以下内容并保存:

#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /usr/local/nginx/sbin/nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        killall -9 keepalived
    fi
fi

给脚本文件增加可执行权限:

[centos@Proxy-1 ~ ]$ sudo chmod 755 /etc/keepalived/nginx_check.sh

5、配置 Keepalived 系统服务。

使用文本编辑器创建配置文件:

[centos@Proxy-1 ~ ]$ sudo gedit /usr/lib/systemd/system/keepalived.service

验证或修改文件内容并保存如下:

[Unit]
Description=LVS and VRRP High Availability Monitor
After=network-online.target syslog.target nginx.service
Wants=network-online.target
Requires=nginx.service

[Service]
Type=forking
User=root
Group=root
PIDFile=/var/run/keepalived.pid
KillMode=process
EnvironmentFile=-/etc/sysconfig/keepalived
ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

重新加载系统服务管理器:

[centos@Proxy-1 ~ ]$ sudo systemctl daemon-reload

6、设置防火墙端口(CentOS8默认安装firewall防火墙),允许"112"端口(Keepalived 默认端口)访问服务器。

[centos@Proxy-1 ~ ]$ sudo firewall-cmd --zone=public --add-port=112/tcp --permanent
[centos@Proxy-1 ~ ]$ sudo firewall-cmd --reload

7、启动/重启 Keepalived 服务(不建议设置为开机自启动)。

启动 Keepalived 服务之前,应确保已正确启动了各节点的 Nginx 服务。各节点的启动或重启的顺序为:① 启动 Keepalived 主节点;② 依次启动 Keepalived 备节点。

[centos@Proxy-1 ~ ]$ sudo systemctl restart keepalived.service

8、启动 Keepalived 可能因为各种未知的原因失败,主要是由于引发了 SELinux 异常。有关如何解决 SELinux 引起的异常,请阅读文章《RedHat/CentOS8【SELinux】引起的安全策略问题解决方案》,文章地址【https://www.jianshu.com/p/a13f974f8bae】。

注意:其他 "Proxy 集群节点" 全部需要按照以上步骤配置。

8、使用浏览器通过虚拟 IP 访问 Web 代理服务。

通过虚拟 IP 访问 Web 代理服务


附录一 Nginx 配置文件详解

位于程序配置目录 "/usr/local/nginx/conf" 下的 "nginx.conf" 是 Nginx 的主配置文件。主配置文件的参数包括:

#定义Nginx运行的用户和用户组
user root root;

#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

#进程文件
pid /var/run/nginx.pid;

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

#工作模式与连接数上限
events{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}

#四层负载均衡(以 MySQL 为例)
stream{
    upstream mysql {
        server 192.168.80.121:3306 weight=1;
        server 192.168.80.122:3306 weight=2;
        server 192.168.80.123:3306 weight=3;
    }

    server {
        #监听端口
        listen 3306;
        proxy_pass mysql;
    }
}

#设定http服务器
http{
    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型
    charset utf-8; #默认编码
    server_names_hash_bucket_size 128; #服务器名字的hash表大小
    client_header_buffer_size 32k; #上传文件大小限制
    large_client_header_buffers 4 64k; #设定请求缓
    client_max_body_size 8m; #设定请求缓
    #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    sendfile on; 
    autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
    tcp_nopush on; #防止网络阻塞
    tcp_nodelay on; #防止网络阻塞
    keepalive_timeout 120; #长连接超时时间,单位是秒

    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #gzip模块设置
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k; #最小压缩文件大小
    gzip_buffers 4 16k; #压缩缓冲区
    gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2; #压缩等级
    gzip_types text/plain application/x-javascript text/css application/xml;
    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
    gzip_vary on;
    #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

    #upstream的动态负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
    upstream www.example.com {
        server 192.168.80.121:80 weight=1;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 weight=3;
    }

    #虚拟主机的配置
    server {
        #监听端口
        listen 80;
        #域名可以有多个,用空格隔开
        server_name www.example.com example.com;
        #设置默认主页
        index index.html index.htm index.php;
        #所有静态文件直接访问的物理磁盘的位置
        root /data/www/example;
        location ~ .*\.(php|php5)?${
            fastcgi_pass 127.0.0.1:9000;
          fastcgi_index index.php;
          include fastcgi.conf;
        }
        #图片缓存时间设置
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${
            expires 10d;
        }
        #JS和CSS缓存时间设置
        location ~ .*\.(js|css)?${
          expires 1h;
        }
        #日志格式设定
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';
        #定义本虚拟主机的访问日志
        access_log /var/log/nginx/ha97access.log access;

        #对 "/" 启用反向代理
        location / {
            proxy_pass www.example.com # http://127.0.0.1:80;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #以下是一些反向代理的配置,可选。
            proxy_set_header Host $host;
            client_max_body_size 10m; #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
            proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
            proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;
            #设定缓存文件夹大小,大于这个值,将从upstream服务器传
        }

        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file conf/htpasswd;
            #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
        }

        #本地动静分离反向代理配置
        #所有jsp的页面均交由tomcat或resin处理
        location ~ .(jsp|jspx|do)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8080;
        }
        #所有静态文件由nginx直接读取不经过tomcat或resin
        location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        { 
            expires 15d;
        }
        location ~ .*.(js|css)?$
        { 
             expires 1h; 
        }
    }
}

说明:

1、"server" 包含多个 "location","location" 属性用于匹配 uri,语法:

location [ = | ~ | ~* | ^~] uri {
...
}
  • 【=】表示精确匹配路径,用于不含正则表达式的 uri 前,如果匹配成功,不再进行后续的查找;
  • 【^~】表示如果该符号后面的字符是最佳匹配,用于不含正则表达式的 uri 前缀,如果匹配成功,不再进行后续的查找;
  • 【~】表示用该符号后面的正则去匹配路径,区分大小写;
  • 【~*】表示用该符号后面的正则去匹配路径,不区分大小写。跟 ~ 优先级都比较低,如有多个 "location" 的正则能匹配的话,则使用正则表达式最长的那个。
  • 如果 uri 包含正则表达式,则必须要有 ~ 或 ~* 标志。

2、Nginx 预定义了一些全局变量,可以在配置的任何位置使用它们,如下表:

变量名 功能说明
$host 请求信息中的 Host,如果请求中没有 Host 行,则等于设置的服务器名,不包含端口
$request_method 客户端请求类型,如 GET、POST
$remote_addr 客户端的 IP 地址
$args 请求中的参数
$arg_PARAMETER GET 请求中变量名 PARAMETER 参数的值,例如:$http_user_agent(Uaer-Agent 值)
$content_length 请求头中的 Content-length 字段
$http_user_agent 客户端agent信息
$http_cookie 客户端 cookie 信息
$remote_addr 客户端的 IP 地址
$remote_port 客户端的端口
$server_protocol 请求使用的协议,如 HTTP/1.0、HTTP/1.1
$server_addr 服务器 IP 地址
$server_name 服务器名称
$server_port 服务器的端口号
$scheme HTTP 方法(如http,https)

其他预定义变量可在互联网上查询学习。


附录二 Nginx 配置虚拟主机头

使用文本编辑器打开配置文件:

[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf

修改或验证文件中的以下参数并保存:

http {
    server {
        # 监听端口
        listen       80;
        # 服务器域名(主机头)
        server_name  www.web1.net;
        # 代理 Web 服务的 Url 前缀,一般是 Web 服务的虚拟目录(可以是正则表达式)。
        location / {
            proxy_pass http://127.0.0.1:81;
        }
    }
    server {
        # 监听端口
        listen       80;
        # 服务器域名(主机头)
        server_name  www.web2.net;
        # 代理 Web 服务的 Url 前缀,一般是 Web 服务的虚拟目录(可以是正则表达式)。
        location / {
            proxy_pass http://127.0.0.1:82;
        }
    }
}

注意:

  • 两个 "server" 使用 "server_name" 定义的主机头来区分。 客户端在访问时,只能通过主机头定义的域名访问(如:http://www.web1.net 或者 http://www.web1.net)。客户端需要在本地 DNS 文件(/etc/hosts)中定义域名解析记录,或者在网卡中设置能够解析主机头的私有 DNS 服务器。
  • 如果客户端通过 IP 地址访问(如:http://192.168.216.128 ),则等同于使用最后一个 "server" 的配置(本例中为: "server_name" 为 "www.web2.net" 的 "server")。

2、重新启动 Nginx 服务。

[centos@host ~ ]$ sudo systemctl restart nginx.service

附录三 扩展 Nginx 客户端身份认证

1、安装 httpd-tools 。

[centos@host ~ ]$ sudo dnf install httpd-tools

2、创建账户/口令数据文件。

[centos@host ~ ]$ sudo htpasswd -bc /usr/local/nginx/conf/auth.db root password

指令格式为:htpasswd -b[c] <数据文件位置> <账号> <口令>。参数 b 表示创建一组账号/口令,参数 c 表示创建数据文件。

3、设置 Nginx 配置文件参数。

使用文本编辑器打开配置文件:

[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf

修改或验证文件中的以下参数并保存:

http {
    server {
        ......
        location / {
            ......
            auth_basic "input password";
            auth_basic_user_file /usr/local/nginx/conf/auth.db;
        }
    }
}

4、重新启动 Nginx 服务。

[centos@host ~ ]$ sudo systemctl restart nginx.service

附录四 扩展 Nginx 跨域访问

1、设置 Nginx 配置文件参数。

使用文本编辑器打开配置文件:

[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf

修改或验证文件中的以下参数并保存:

http {
    server {
        ......
        # 全局变量获得当前请求origin,带cookie的请求不支持 "*" 。
        add_header 'Access-Control-Allow-Origin' $http_origin;
        # 设置为 "true" 表示传递 cookie 。
        add_header 'Access-Control-Allow-Credentials' 'true';
        # 允许跨域请求的方法。
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 
        # 允许请求的 header,可以为 "*" 。
        add_header 'Access-Control-Allow-Headers' $http_access_control_request_headers; 
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';

        if ($request_method = 'OPTIONS') {
            # OPTIONS 请求的有效期,在有效期内不用发出另一条预检请求
            add_header 'Access-Control-Max-Age' 1728000;   
            add_header 'Content-Type' 'text/plain; charset=utf-8';
            add_header 'Content-Length' 0;
    
            return 204; 
        }
        
        location / {
            ......
        }
    }
}

2、重新启动 Nginx 服务。

[centos@host ~ ]$ sudo systemctl restart nginx.service

附录五 扩展 Nginx 网页压缩

1、设置 Nginx 配置文件参数。

使用文本编辑器打开配置文件:

[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf

修改或验证文件中的以下参数并保存:

http {
    server {
        ......
        # 是否开启 gzip , on 表示开启,off 表示禁用。默认off。
        gzip on;
        # 压缩 MIME 文件的类型,其中 text/html 被系统强制启用。
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
        location / {
            ......
        }
    }
}

2、重新启动 Nginx 服务。

[centos@host ~ ]$ sudo systemctl restart nginx.service

附录六 Nginx 四层网络协议负载均衡

1、设置 Nginx 配置文件参数。

使用文本编辑器打开配置文件:

[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf

修改或验证文件中的以下参数并保存:

#四层负载均衡(以 MySQL 为例)
stream{
    upstream mysql {
        server 192.168.80.121:3306 weight=1;
        server 192.168.80.122:3306 weight=2;
        server 192.168.80.123:3306 weight=3;
    }

    server {
        #监听端口
        listen 3306;
        proxy_pass mysql;
    }
}

2、重新启动 Nginx 服务。

[centos@host ~ ]$ sudo systemctl restart nginx.service

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345