# nginx安装配置大全解析 & nginx高可用集群负载均衡配置
本文全面解析nginx安装、配置、进程模型、负载均衡、高可用集群等核心技术。
—
## 1、安装
### 安装依赖
“`bash
yum install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
“`
### 创建临时目录
“`bash
mkdir /var/temp/nginx -p
“`
### 配置安装模块
“`bash
./configure \
–prefix=/usr/local/nginx \
–pid-path=/var/run/nginx/nginx.pid \
–lock-path=/var/lock/nginx.lock \
–error-log-path=/var/log/nginx/error.log \
–http-log-path=/var/log/nginx/access.log \
–with-http_gzip_static_module \
–http-client-body-temp-path=/var/temp/nginx/client \
–http-proxy-temp-path=/var/temp/nginx/proxy \
–http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
–http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
–http-scgi-temp-path=/var/temp/nginx/scgi
“`
### 编译并安装
“`bash
make && make install
“`
—
## 2、进程模型
**master主进程**:接收指令,控制worker
**worker工作进程**:实际对外提供服务
“`nginx
#user nobody;
# 可调整工作进程数,通常不大于CPU核心数量
# 让每个worker进程都有一个CPU可用
worker_processes 2;
“`
—
## 3、NGINX处理web请求解析机制
多个worker工作进程通过【抢占机制】分配客户端处理权。
### 3.1 工作线程的分配
1. **主动激活1个worker**:`accept_mutex on`
2. **唤醒所有worker通过互斥锁抢夺**:`accept_mutex off`
### 3.2 epoll模型
### 3.3 工作线程链接数的配置
“`nginx
events {
# 默认每个工作进程都使用epoll
use epoll;
# 每个工作进程的最大连接数
worker_connections 1024;
}
“`
—
## 4、常用命令
1. `nginx -s stop` – 快速关闭nginx(生产环境不建议)
2. `nginx -s quit` – 等待所有已链接关闭后才关闭
3. `nginx -t` – 检查配置文件
4. `nginx -s reload` – 重启
5. `nginx -V` – 展示nginx详细信息
6. `nginx -c` – 设置nginx配置文件
—
## 5、日志切割
### 手动切割日志
创建切割脚本 `cut_my_log.sh`:
“`bash
#!/bin/bash
LOG_PATH=”/var/log/nginx/”
RECORD_TIME=$(date -d “yesterday” +%Y-%m-%d+%H:%M)
PID=/var/run/nginx/nginx.pid
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log
# 向Nginx主进程发送信号,重新打开日志文件
kill -USR1 `cat $PID`
“`
添加执行权限:`chmod 777 cut_my_log.sh`
### 定时切割日志
“`bash
# 安装定时任务软件
yum install crontabs
# 添加定时任务
crontab -e
*/1 * * * * /usr/local/nginx/sbin/cut_my_log.sh
# 重启定时任务
service crond restart
“`
—
## 6、匹配规则
### alias别名
浏览器访问 `/static` 实际从 `/home/test` 访问:
“`nginx
location /static {
alias /home/test;
}
“`
### 精确匹配【=】
“`nginx
location = /lhy/index.html {
root /app;
}
“`
### 正则表达式【~】
区分大小写:
“`nginx
location ~ \.(img|png|jpeg|pdf) {
root /app/img;
}
“`
不区分大小写:
“`nginx
location ~* \.(img|png|jpeg|pdf) {
root /app/img;
}
“`
### 以某个字符开头【^~】
“`nginx
location ^~ /lhy/img {
root /app/;
}
“`
—
## 7、跨域解决方案
“`nginx
listen 8080;
server_name localhost;
# 允许跨域请求的域,*代表所有
add_header ‘Access-Control-Allow-Origin’ *;
# 允许带上cookie请求
add_header ‘Access-Control-Allow-Credentials’ ‘true’;
# 允许请求的方法
add_header ‘Access-Control-Allow-Methods’ *;
# 允许请求的header
add_header ‘Access-Control-Allow-Headers’ *;
“`
—
## 8、防盗链配置
“`nginx
# 对源站点验证
valid_referers *.imooc.com;
# 非法引入会进入下方判断
if ($invalid_referer) {
return 404;
}
“`
—
## 9、web应用集群
“`nginx
# 使用upstream配置上游服务器
# 默认使用轮询方式进行分配
upstream test_servers {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}
server {
listen 90;
server_name location;
location / {
proxy_pass http://test_servers;
}
}
“`
—
## 10、负载均衡
### 轮询(weight)
“`nginx
upstream test_servers {
server 127.0.0.1:8081 weight=1;
server 127.0.0.1:8082 weight=2;
server 127.0.0.1:8083 weight=5;
}
“`
### ip_hash
根据客户端IP进行分配。使用iphash时,某个节点需下线应使用down标记,而非删除节点,否则会导致缓存失效。
“`nginx
upstream test_servers {
ip_hash;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}
“`
### url_hash
将请求的url进行hash计算分发:
“`nginx
upstream tomcats {
hash $request_uri;
server 192.168.1.173:8080;
server 192.168.1.174:8080;
server 192.168.1.175:8080;
}
“`
### 最少连接数
转发到最少连接的机器节点:
“`nginx
upstream tomcats {
least_conn;
server 192.168.1.173:8080;
server 192.168.1.174:8080;
server 192.168.1.175:8080;
}
“`
—
## 11、upstream指令参数
### max_conns
限制最大连接数,超过限制返回502:
“`nginx
upstream test_servers {
server 127.0.0.1:8081 max_conns=20;
server 127.0.0.1:8082 max_conns=10;
}
“`
### slow_start(商业版)
权重在指定时间内从0提升至配置权重:
“`nginx
upstream test_servers {
server 127.0.0.1:8083 weight=6 slow_start=60s;
}
“`
### down
标识节点不可用:
“`nginx
upstream test_servers {
server 127.0.0.1:8081 down;
}
“`
### backup
备用节点,其他节点全部挂了才能被访问:
“`nginx
upstream test_servers {
server 127.0.0.1:8081 backup;
}
“`
### max_fails、fail_timeout
失败次数达到指定数,节点被标记为不可用:
“`nginx
upstream test_servers {
server 127.0.0.1:8081 max_fails=2 fail_timeout=15s;
}
“`
—
## 12、keepalive提高吞吐量
“`nginx
upstream tomcats {
server 127.0.0.1:8082;
server 127.0.0.1:8083;
# 设置长连接处理的数量
keepalive 32;
}
server {
listen 80;
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats;
# 设置长连接http版本为1.1
proxy_http_version 1.1;
# 清除connection header信息
proxy_set_header Connection “”;
}
}
“`
—
## 13、缓存
### 浏览器缓存(expires)
“`nginx
location ^~ /lhy/img {
root /app/;
expires 10s;
}
“`
### 反向代理缓存
“`nginx
proxy_cache_path /usr/local/nginx/upstream_cache
keys_zone=mycache:5m max_size=1g inactive=1m use_temp_path=off;
location / {
proxy_pass http://tomcats;
# 启用缓存
proxy_cache mycache;
# 针对200和304状态码缓存8小时
proxy_cache_valid 200 304 8h;
}
“`
—
## 14、Nginx高可用集群(自建机房)
### Keepalived
Keepalived可以虚拟一个VIP。多个节点选举出一个对外提供服务的ip。
**双机主备**:一主一备,备用机永远不使用,存在资源浪费。
**双主热备**:设置2个虚拟ip,互为主备关系,某一个ip挂了会转发到另一个节点。
—
## 15、Nginx高可用集群(云端服务器)
### 双机主备
云服务厂商提供负载均衡ip(公网ip),云服务器绑定到负载均衡ip,域名解析到负载均衡ip。
### 双主热备
域名绑定2个负载均衡ip,DNS轮询转发到某一个ip。互为主备,某一个ip挂了会转发到另一个节点。
—
**nginx配置要点总结:**
– 进程模型:master控制worker
– 负载均衡:轮询、ip_hash、url_hash、最少连接
– 高可用:Keepalived(自建机房)、云负载均衡(云端)
– 性能优化:keepalive、缓存、epoll模型
—
铁三角团队 · 峰哥 | write | tech
共同成长 💪
—

峰网博客



