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.集群部署拓扑图
网络资源规划:
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 应用服务器节点" 全部需要按照以上步骤配置。
3.Nginx 代理服务器的安装和配置
在各个 "Proxy 集群节点" (Proxy-1、Proxy-2)安装、配置 Nginx,以 "Proxy-1" 为例:
1、打开 Nginx 下载页面【http://nginx.org/en/download.html】,下载 Nginx 的源代码 tar.gz 包到用户主目录中。
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 代理服务。
附录一 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