在学习Nginx前,建议大家至少拥有以下技能:
Nginx概述
- Web服务/网站服务: 给用户提供网站功能的服务
- 本质: 实现http协议功能。用户发出http请求,nginx处理,给用户 http响应
Web服务/网站服务选择

Nginx vs Apache 近10年全世界使用率
Apache vs Nginx比较
- Apache: 基于select模型的同步IO模型。
- Nginx: 基于epoll模型的异步IO模型。
举例一:找对象
- 同步:一个屋子一个屋子去找。
- 异步:拿出名册,名册上记录了名字和对应的屋子号。
举例二:幼儿园
- 同步:老师挨个问小朋友是否需要上厕所。
- 异步:需要上厕所的小朋友主动到指定位置集合,老师定时带这个集合里的小朋友一起去。
Nginx功能特点
企业面试时常需解答的Nginx HTTP服务器特色及优点:
- 支持高并发:能支持几万并发连接(在静态小文件业务环境下尤其出色)。
- 资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB。
- 反向代理与负载均衡:具备HTTP反向代理及加速缓存功能,内置对后端RS节点服务器的健康检查,相当于专业的Haproxy或LVS的功能。
- 高效的IO模型:支持异步网络IO事件模型epoll (Linux 2.6+)。
核心功能:
- Web服务器/网站服务器
- 反向代理功能
- 负载均衡功能
- 缓存功能
- 其他扩展功能(通过安装插件),例如:负载均衡监控检查、会话保持、直播推流、流量镜像。
静态资源 vs 动态资源
- 静态资源:一般指页面文件,如
html,js,css,图片,视频,音频等。静态资源Nginx可以自行处理。
- 动态资源:一般指需要与后端程序交互的文件,如以
.php,.jsp,.do 结尾的文件。例如用户提交订单、评论等操作,其URL中常带有 ? 或 & 等特殊符号。
Nginx版本与安装
版本选择:建议选择稳定版(Stable Version)或长期维护版本(LTS)。
Nginx 1.20.1 是一个稳定的选择。
安装方式选择

Nginx yum源配置(备用)
# 目前可以直接安装最新稳定版,若不行则配置此yum源
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
Nginx极速上手指南
a) 安装
# 01. 安装nginx
yum install -y nginx
# 02. 检查是否安装成功
rpm -qa | grep nginx
b) Nginx目录结构
提示:不同的安装方式目录结构略有不同,但整体一致。

[root@oldboy-web01 ~]# rpm -ql nginx
# 日志切割配置
/etc/logrotate.d/nginx
# 配置文件部分
/etc/nginx/mime.types # Nginx支持的媒体类型(文件类型)
/etc/nginx/nginx.conf # 主配置文件
/etc/nginx/fastcgi.conf # nginx与PHP搭配的配置文件 (nginx+php使用fastcgi)
# ... 其他配置文件
# 启动配置文件
/usr/lib/systemd/system/nginx.service
# nginx命令
/usr/sbin/nginx
# Nginx默认的站点目录
/usr/share/nginx/html/
/usr/share/nginx/html/index.html
# 日志目录
/var/log/nginx/
/var/log/nginx/access.log
/var/log/nginx/error.log
c) nginx.conf 核心配置
- 核心区域:定义运行用户、进程数。
- events区域:定义每个工作进程的连接数。
- http区域:主要配置区域。
- 定义访问日志格式。
- 指定访问日志位置。
- 包含其他配置文件
include /etc/nginx/conf.d/*.conf。
- server部分 (建议将每个站点的配置单独放在
conf.d/*.conf 中):
listen 80; 监听端口。
server_name 域名;。
root 网站站点目录(网站根目录);。
index index.html; 指定首页文件(网站入口)。
location / 用来匹配URI,location / 是默认规则。

实战:搭建第一个站点
a) 站点目录规划
建议将与网站相关的文件放在统一的目录下,例如:
/app/
/app/code/ # 存放代码
/app/code/live # 直播网站代码
/app/code/game # 游戏网站代码
/app/data/ # 数据
/app/tools/ # 可直接使用的命令或工具(解压后)
/server/scripts/ # 脚本
/server/tools/ # 工具包(压缩文件)
创建游戏网站目录:
mkdir -p /app/code/game
b) 搭建游戏网站
-
准备环境:
mkdir -p /app/code/game
echo "game.oldboylinux.cn" > /app/code/game/index.html
-
修改Nginx配置:不建议将server配置直接写在主配置文件中。
-
检查配置并重启Nginx:
nginx -t # 检查配置文件语法
systemctl start nginx # 如果未启动,则启动
systemctl reload nginx # 如果已运行,重新加载配置
-
Linux本地测试:
[root@web01 ~]# curl 10.0.0.7
game.oldboylinux.cn
c) 浏览器通过IP访问测试

d) 配置本地hosts解析,实现域名访问
在客户端(如Windows)的 C:\Windows\System32\drivers\etc\hosts 文件中添加:
10.0.0.7 game.oldboylinux.cn
然后即可在浏览器通过域名 http://game.oldboylinux.cn 访问。
部署多个网站应用
将多个前端开发项目(如小游戏)代码解压到站点目录下:
unzip bird.zip -d /app/code/game/
unzip mine.zip -d /app/code/game/
unzip type-game.zip -d /app/code/game/
通过浏览器访问对应的路径即可,例如 http://game.oldboylinux.cn/bird/。
Nginx初步使用:虚拟主机
一个虚拟主机(即一个网站)对应Nginx配置文件中的一个 server 区域。

生产建议:
- 不同虚拟主机的配置单独存放。
- 虚拟主机配置推荐存放在
conf.d 目录下,并以 .conf 结尾。
- 对于不再使用的虚拟主机,可通过修改配置文件后缀名(如改为
.conf.gz)来禁用。
1) 基于域名的虚拟主机
这是最常用的方式。通过不同的域名区分站点。

配置示例 (/etc/nginx/conf.d/ 目录下):
game.oldboylinux.cn.conf
server {
listen 80;
server_name game.oldboylinux.cn;
root /app/code/game;
location / {
index index.html;
}
}
live.oldboylinux.cn.conf
server {
listen 80;
server_name live.oldboylinux.cn;
root /app/code/live;
location / {
index index.html;
}
}
www.oldboylinux.cn.conf
server {
listen 80;
server_name www.oldboylinux.cn;
root /app/code/www;
location / {
index index.html;
}
}
创建站点目录与首页:
mkdir -p /app/code/{game,live,www}
for name in game live www; do
echo "$name.oldboylinux.cn" > /app/code/$name/index.html
done
测试:
# Linux下通过curl测试,使用 -H 参数指定Host头模拟不同域名访问
curl -H "Host:live.oldboylinux.cn" 10.0.0.7
curl -H "Host:www.oldboylinux.cn" 10.0.0.7
2) 基于端口的虚拟主机
通过不同的端口号区分站点。常用于内部服务或测试环境。
# game.oldboylinux.cn.conf
server {
listen 82; # 监听82端口
server_name game.oldboylinux.cn;
root /app/code/game;
location / {
index index.html;
}
}
# 测试
curl 10.0.0.7:80 # 访问www站点
curl 10.0.0.7:81 # 访问live站点
curl 10.0.0.7:82 # 访问game站点
3) 基于IP的虚拟主机
将服务绑定到特定的IP地址上,限制用户只能通过该IP访问。常与特殊端口组合使用。
server {
listen 172.16.1.7:8888; # 仅监听172.16.1.7的8888端口
server_name game.oldboylinux.cn;
root /app/code/game;
location / {
index index.html;
}
}
curl 172.16.1.7:8888 # 成功
curl 10.0.0.7:8888 # 失败,Connection refused
4) 虚拟主机小结

Nginx处理用户请求流程
详细请求处理流程图:

处理不存在的域名或IP访问:

可以配置一个默认的 server 块来处理所有未匹配到的请求:
# /etc/nginx/conf.d/default.conf
server {
listen 80 default_server; # default_server 标识此为默认主机
server_name _; # 使用下划线匹配所有未定义的域名
charset utf8;
default_type text/plain;
return 200 "别乱访问网站";
}
Nginx日志管理
Nginx主要有两种日志:
- access.log: 访问日志,记录所有客户端请求。
- error.log: 错误日志,记录Nginx运行和请求处理过程中的错误信息。
1) 访问日志
- 日志格式定义:在主配置文件
http 块中使用 log_format 指令定义。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

- 日志文件路径与格式应用:使用
access_log 指令。
access_log /var/log/nginx/access.log main; # 使用名为‘main’的格式

- 关闭访问日志:
access_log off;
- 为每个站点配置独立访问日志:
# 在具体的 server 块中配置
server {
listen 80;
server_name www.oldboylinux.cn;
root /app/code/www;
access_log /var/log/nginx/www.oldboylinux.cn-access.log main;
...
}

2) 错误日志
3) 日志切割
防止单个日志文件过大,便于管理和归档。通常使用系统自带的 logrotate 工具。