前言
nginx是目前互联网行业主流开源web服务,依靠异步非阻塞epoll事件模型,极低cpu、内存消耗即可支撑数万并发,性能远超传统apache。它不只是单纯网页服务器,还能承担反向代理、七层负载均衡、https证书终端、缓存、限流、防盗链等企业核心功能。
本文基于centos7环境完整梳理nginx底层架构、配置语法、五大核心功能,附带全套可复制命令、虚拟机实验拓扑、页面效果截图,适合运维自学、课堂实训、企业上岗复习。
一、nginx基础介绍
1.1 nginx核心优势
由俄罗斯工程师igor sysoev开发,核心竞争力为事件驱动异步非阻塞io:
- apache架构:一连接对应一个进程/线程,万并发会创建上万进程,内存暴涨、cpu上下文切换开销巨大;
- nginx架构:仅少量worker进程,依靠io多路复用,单个进程可同时处理成千空闲连接,资源占用极低,单机支持5万并发。
1.2 nginx多功能定位
- 静态资源服务器:托管html、css、js、图片、安装包;
- 反向代理:转发前端请求至java/php/node后端,隐藏后端真实ip;
- 七层负载均衡:多后端集群分发流量,实现业务扩容、故障自动隔离;
- ssl/tls终端:统一处理https加密解密,后端保持http通信;
- 配套实用能力:gzip压缩、ip访问控制、接口限流、图片防盗链、url重写、http缓存。
1.3 master-worker多进程架构
- master主进程(root权限运行)
只负责管理,不处理用户请求:读取解析配置、管控所有worker、接收启动/停止/reload系统信号。 - worker工作进程
业务处理核心,单线程异步io,推荐配置worker_process auto自动匹配cpu物理核心,进程之间相互独立。 - 可选cache进程
cache manager:定时清理过期磁盘缓存;
cache loader:服务启动加载缓存元数据。
1.4 热重载原理(nginx -s reload)
零中断更新配置流程:
- master校验新配置语法是否合法;
- 新建一批worker进程加载新配置,接收新用户请求;
- 向旧worker发送退出信号,旧进程处理完已有连接后自动关闭;
全程服务无停机,业务不中断。
1.5 nginx常用管理命令
nginx # 启动服务 nginx -s stop # 强制快速停止 nginx -s quit # 优雅停机,处理完现有连接再退出 nginx -s reload # 重载配置(日常最常用) nginx -t # 校验配置文件语法错误
二、centos7 nginx基础部署实验
2.1 实验节点规划
| 主机名 | ip地址 | 角色 |
|---|---|---|
| nginx-server | 10.1.8.10/24 | nginx服务端 |
| nginx-client | 10.1.8.11/24 | 测试客户端 |
2.2 服务器基础环境配置
修改主机名、静态ip、关闭防火墙(实训环境简化操作)
# nginx-server操作 hostnamectl set-hostname nginx-server nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.10/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes nmcli connection up ens33 systemctl disable firewalld --now setenforce 0 # nginx-client同步修改ip配置 hostnamectl set-hostname nginx-client nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.11/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes nmcli connection up ens33
2.3 nginx安装、启动、页面测试
# 配置阿里epel软件源 wget -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo # 安装nginx yum -y install nginx # 设置开机自启并立即启动 systemctl enable nginx --now # 自定义首页内容 mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.ori echo hello world from nginx > /usr/share/nginx/html/index.html # 防火墙放行http服务 firewall-cmd --add-service=http --permanent firewall-cmd --reload
2.4 客户端访问验证
客户端修改hosts解析域名
vim /etc/hosts # 添加记录 10.1.8.10 www.laogao.cloud # curl测试访问 curl http://www.laogao.cloud
三、nginx完整配置层级结构
主配置文件路径:/etc/nginx/nginx.conf
配置由外到内五层嵌套,层级权限:子配置覆盖父配置
- 全局块:全局进程、日志、pid、模块加载,作用于整个nginx实例
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; include /usr/share/nginx/modules/*.conf;
- events块:控制网络并发参数
events {
worker_connections 1024; # 单个进程最大并发连接
use epoll; # linux专属io多路复用模型
multi_accept on;
}
- http块:全站通用http全局配置,包含日志、文件传输、长连接、模块化引入
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '客户端ip - 用户 [时间] 请求 状态码...';
access_log /var/log/nginx/access.log main;
sendfile on; # 零拷贝,静态文件高性能
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65; # http长连接超时
include /etc/nginx/conf.d/*.conf; # 拆分站点配置
}
- server块(虚拟主机):绑定端口、域名,对应单个网站
- location块:匹配url路径,控制资源访问、代理、权限
3.1 location匹配优先级(从高到低)
location = /uri精确匹配(最高)location ^~ /uri前缀匹配,跳过正则判断location ~ 正则区分大小写正则location ~* 正则不区分大小写正则location /xxx普通前缀匹配location /全局兜底匹配(最低)
3.2 nginx高频内置变量
| 变量 | 作用 |
|---|---|
| $remote_addr | 客户端真实ip |
| $host | 请求域名 |
| $uri | 请求路径,不带get参数 |
| $request_uri | 完整路径+参数 |
| $scheme | http / https 协议 |
| $request_method | get/post 请求方式 |
四、五大核心功能完整实操
功能一:虚拟主机(一台服务器部署多个网站)
实现三种方式:域名区分(生产主流)、端口区分、ip区分
1、域名虚拟主机实操
# 新建两个站点目录
mkdir /usr/share/nginx/web1 /usr/share/nginx/web2
echo web1.laogao.cloud > /usr/share/nginx/web1/index.html
echo web2.laogao.cloud > /usr/share/nginx/web2/index.html
# 新建独立站点配置文件
vim /etc/nginx/conf.d/vhost-name.conf
server {
listen 80;
server_name web1.laogao.cloud;
root /usr/share/nginx/web1;
index index.html;
}
server {
listen 80;
server_name web2.laogao.cloud;
root /usr/share/nginx/web2;
index index.html;
}
# 重载配置
nginx -s reload
客户端hosts绑定两个域名,curl分别访问即可返回不同页面。
2、端口虚拟主机
同一域名,不同端口区分站点,配置listen 8081、listen 8082即可。
功能二:https加密站点 + http强制跳转
4.1 生成自签测试证书
mkdir certs && cd certs # 生成私钥 openssl genrsa -out www.key 2048 # 证书请求文件 openssl req -new -key www.key -out www.csr -subj "/c=cn/st=js/l=nj/o=lg/ou=devops/cn=www.laogao.cloud/emailaddress=webadmin@laogao.cloud" # 生成公钥证书 openssl x509 -req -days 3650 -in www.csr -signkey www.key -out www.crt # 移动证书目录 mv www* /etc/ssl/certs/www.laogao.cloud
4.2 https站点配置
vim /etc/nginx/conf.d/ssl.conf
# https站点
server {
listen 443 ssl http2;
server_name www.laogao.cloud;
ssl_certificate "/etc/ssl/certs/www.laogao.cloud/www.crt";
ssl_certificate_key "/etc/ssl/certs/www.laogao.cloud/www.key";
ssl_protocols tlsv1.2 tlsv1.3;
root /usr/share/nginx/html;
}
# 80端口301永久跳转https
server {
listen 80;
server_name www.laogao.cloud;
return 301 https://$host$request_uri;
}
4.3 目录基础认证(密码访问页面)
搭配https使用,避免密码明文传输
# 安装密码生成工具
yum -y install httpd-tools
# 创建账号laogao,密码123456
htpasswd -b -c /etc/nginx/.htpasswd laogao 123456
# 配置文件添加认证规则
location /auth-basic/ {
auth_basic "请输入登录账号";
auth_basic_user_file "/etc/nginx/.htpasswd";
}
功能三:nginx解析php动态.网站
静态页面是提前写死文件,php页面实时运行代码生成内容,nginx不直接解析php,通过fastcgi转发至php-fpm进程处理。
4.4 部署php环境
yum install -y php php-fpm php-gd php-mbstring systemctl enable php-fpm --now # 新建php测试页面 echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/info.php
4.5 nginx转发php配置
vim /etc/default.d/php.conf
location ~ \.php$ {
try_files $uri =404; # 防路径穿透漏洞
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param script_filename $document_root$fastcgi_script_name;
include fastcgi_params;
}
nginx -s reload
功能四:反向代理详解
4.6 正向代理 vs 反向代理区别
- 正向代理:替客户端上网,隐藏用户(翻.墙工具);
- 反向代理:替后端服务器接收请求,隐藏后端真实ip,企业网关标准架构。
核心指令proxy_pass,配套参数向后端传递客户端真实ip
location /api/ {
proxy_pass http://192.168.1.200/;
proxy_set_header host $http_host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
}
关键细节:proxy_pass末尾斜杠
- 带
/:剔除location匹配路径,只转发后缀; - 不带
/:完整拼接location路径转发,日常高频踩坑点。
功能五:七层负载均衡upstream集群
5.1 实验拓扑
代理服务器proxy(10.1.8.20),三台后端nginx节点10.1.21/22/23,客户端统一访问代理,流量自动分发。
5.2 upstream配置语法
http {
upstream backends {
server nginx1.laogao.cloud;
server nginx2.laogao.cloud weight=2;
server nginx3.laogao.cloud backup;
# server xxx down; 手动下线节点
}
server {
listen 80;
server_name www.laogao.cloud;
location / {
proxy_pass http://backends;
# 传递真实客户端信息
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
}
}
}
5.3 五种负载均衡调度算法
- round_robin 默认轮询:请求平均分给所有后端;
- weight 权重:性能更好服务器分配更多流量;
- ip_hash:同一客户端ip固定后端,解决session共享;
- least_conn:优先分给当前连接最少的节点;
- least_time(nginx商业版):优先响应速度最快服务器。
五、nginx日志与常见故障排错
5.1 两种核心日志
- access.log:记录每一条访问,包含客户端ip、访问时间、请求、状态码、浏览器ua;
- error.log:报错专用,502、配置错误、端口拦截全部在此排查。
5.2 生产高频报错
- 502 bad gateway:后端php-fpm/服务未启动、防火墙拦截端口;
- 504 gateway timeout:后端代码执行超时;
- 403 forbidden:网站目录权限不足、无index首页;
- 并发低:调高worker_connections、系统文件句柄ulimit限制。
六、整体总结
- nginx依托epoll异步模型,高并发、低资源占用,兼顾静态服务、反向代理、负载均衡多场景;
- master-worker进程架构支持热重载,修改配置业务零中断,线上运维友好;
- 配置分为全局/events/http/server/location五层,location匹配优先级必须熟记,是写配置核心;
- 企业常用五大功能:多站点虚拟主机、https全站加密、php动态解析、反向代理、七层负载均衡;
- upstream集群支持多种流量调度策略,可实现后端故障自动隔离、业务高可用;
- 实操规范:配置拆分到conf.d目录,修改前执行nginx -t校验语法;反向代理务必传递客户端真实ip;php站点增加try_files安全防护;线上使用正规ca证书,禁止自签证书对外服务。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论