Nginx 入门:从安装到实战
├── nginx.conf # 主配置 ├── conf.d/ # 通用配置 ├── sites-available/ # 可用站点 └── sites-enabled/ # 启用站点(符号链接)定期更新Nginx版本禁用不必要模块配置WAF(如ModSecurity)# 状态监控 location /nginx_status {deny all;
一、初识Nginx:它是什么,为什么必备?
简单说,Nginx 是一款轻量级的 Web 服务器,就像互联网服务的“高效门卫”——专门负责接收用户的浏览器请求、合理分发任务给后端服务,最后把处理结果返回给用户。
它的三大优点让它成为互联网标配:
- ⚡️ 高性能:C语言开发,采用事件驱动的
异步非阻塞处理方式框架(不用等一个请求处理完再接下一个,能同时高效处理大量请求),具备极好的IO性能,轻松应对10万+并发 - 💾 低消耗:
内存占用少,处理静态资源时,每万连接仅占用2.5MB左右内存,低配服务器也能稳定运行。 - 🔧 高扩展:模块化设计,支持
HTTP/2、WebSocket等现代协议,能实现多种功能——静态资源托管、反向代理、负载均衡,还能做安全防护。
二、核心概念速通
2.1 Web服务器 vs 应用服务器
| 类型 | 核心职责 | 代表产品 | 典型场景 | 类比 |
|---|---|---|---|---|
| Web服务器 | 直接处理HTTP请求,返回静态资源 | Nginx、Apache | 展示HTML、图片、CSS、JS等静态文件; 转发请求 |
超市货架,直接拿东西 |
| 应用服务器 | 运行业务逻辑,生成动态内容 | Tomcat\JBoss | 处理用户登录、订单提交等动态请求; 提供API服务 |
超市后厨,加工食材(处理请求)后再给你 |
小提示:现在很多应用服务器(比如Tomcat)也自带Web服务器功能,但处理静态资源的效率远不如Nginx。
2.2 正向代理 和 反向代理
代理的核心是“中间转发”,分清正向和反向,关键看“替谁干活”:
正向代理(forward proxy):替客户端“跑腿”
位于客户端和目标服务器之间,客户端想访问目标服务器时,先把请求发给代理服务器,代理再转发请求、获取结果后返回给客户端。
典型例子:VPN(帮你突破网络限制,访问外网资源)、公司内网代理(帮内网电脑访问互联网)。核心特点:代理设置在客户端(比如你电脑上配置VPN),目标服务器只知道请求来自代理,不知道真实客户端IP。
优点:隐藏客户端IP、突破访问限制、缓存资源提高访问速度。
反向代理(reverse proxy):替服务器“接活”:
客户端直接向网站域名发起请求,请求先到达反向代理服务器,再由代理转发给内网的Web服务器(比如Tomcat),服务器处理完后,通过代理把结果返回给客户端。
典型例子:负载均衡(把请求分给多台服务器)、网站静态资源代理。核心特点:代理设置在服务器端(用户看不到),客户端只知道访问的是代理服务器,不知道内网真实服务器的IP。
优点:隐藏服务器IP、分担服务器压力(负载均衡)、缓存资源提速、提供安全防护。
总结:看一个代理服务器是正向代理还是反向代理,要看是站在谁的角度来分析问题
正向代理 VS 反向代理
| 类型 | 通俗理解 | 例子 |
|---|---|---|
| 正向代理 | 替客户端干活(帮你访问目标服务器) | VPN(帮你翻出去看外网) |
| 反向代理 | 替服务器干活(帮服务器接请求) | 快递柜(帮快递员收快递,你去柜里取) |
三、Linux 下安装 Nginx
以最常用的CentOS系统为例,全程用命令行操作,复制粘贴即可完成(虚拟机、云服务器都适用)。
3.1 安装步骤
步骤1:安装依赖工具
Nginx运行需要gcc、zlib等工具,先一次性安装:
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
步骤2:下载并解压Nginx安装包
wget https://nginx.org/download/nginx-1.22.0.tar.gz # 下载安装包
tar -zxvf nginx-1.22.0.tar.gz # 解压
cd nginx-1.22.0 # 进入解压目录
步骤3:指定安装目录并编译安装
把Nginx安装到/usr/local/nginx(默认常用路径,方便后续管理):
./configure --prefix=/usr/local/nginx # 安装到/usr/local/nginx
make && make install # 编译并安装
步骤4:设置全局快捷命令
默认情况下,Nginx命令只能在安装目录的sbin文件夹下执行,设置软链接后,任何目录都能调用:
ln -s /usr/local/nginx/sbin/nginx /usr/bin/ # 建立软链接
步骤5:验证安装成功
nginx -v # 查看Nginx版本
如果输出“nginx version: nginx/1.22.0”,说明安装成功!
3.2 Nginx目录结构速查
安装完成后,/usr/local/nginx目录下的核心文件结构:
/usr/local/nginx/
├── conf/ # 配置文件目录(最核心的nginx.conf在这里)
│ └── nginx.conf # 主配置文件(所有功能都靠它配置)
├── html/ # 默认网站根目录(存放静态资源)
├── logs/ # 日志文件目录(访问日志、错误日志)
└── sbin/ # 可执行文件目录(nginx启动命令在这里)
3.3 常用Nginx命令(必记)
任何目录下都能执行这些命令,管理Nginx服务:
nginx -v # 查看Nginx版本
nginx -t # 测试配置文件是否正确(修改配置后必做)
nginx # 启动Nginx服务
nginx -s stop # 立即停止服务(不管正在处理的请求)
nginx -s quit # 优雅停止(处理完当前请求再停止,推荐用这个)
nginx -s reload # 重载配置文件(修改配置后生效,不用重启服务)
启动完成后查看nginx进程 ps -ef | grep nginx
3.4 常见问题处理
问题1:Windows下启动Nginx失败,报错“bind() to 0.0.0.0:80 failed”
原因:80端口被其他服务占用(最常见的是IIS服务)。
解决方案:以管理员身份打开cmd,输入命令关闭IIS服务:net stop w3svc
如果还是占用,可通过“netstat -ano | findstr :80”查找占用端口的进程,结束对应进程即可。
四、 核心配置文件详解:nginx.conf
Nginx 的所有功能都靠conf/nginx.conf配置,它的结构像 “套娃”,从外到内分 3 层,层层递进:
- 全局块:控制Nginx整体运行参数(比如工作进程数)
- events块:控制网络连接相关参数(比如最大连接数)
- http块:最核心的配置层,包含代理、缓存、虚拟主机等配置,可嵌套多个server块
完整配置文件
# 1. 全局块:Nginx整体配置
worker_processes 1; # 工作进程数,建议设成CPU核心数(如4核就设4,充分利用资源)
# 2. events块:网络连接相关配置
events {
worker_connections 1024; # 每个进程最大连接数(1024足够新手用)
# 最大并发连接数 ≈ 工作进程数 × 每个进程连接数
}
# 3. http块:核心配置层,可包含多个server(虚拟主机)
http {
include mime.types; # 引入文件类型映射表(告诉Nginx不同后缀的文件是什么类型)
default_type application/octet-stream; # 默认文件类型(未知类型时用这个)
# sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off
sendfile on; #开启高效文件传输模式(处理静态资源时必开,提速)
keepalive_timeout 65; # 长连接超时时间(单位:秒),避免频繁建立连接
client_max_body_size 10M; # 设置最大请求体为 10MB,用于限制客户端请求体的最大大小。这个配置项主要用于处理文件上传和其他大数据量传输的场景。
# 3.1 负载均衡配置(可选,多个服务器分工时用)
upstream nginx-cluster{ # 定义集群名称(自定义,比如nginx-cluster)
ip_hash; # 负载均衡策略1:按客户端IP哈希分配,同IP固定访问一台服务器(解决会话保持问题)
# hash $request_uri; # 策略2:按URL哈希分配,相同URL固定访问一台服务器(缓存优化用)
# hash_method crc32; # 配合URL哈希的算法
#负载均衡策略3:fair(第三方);按后端服务器的响应时间来分配请求,响应时间短的优先分配。
#例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
# 集群中的服务器列表,可配置多个
server 192.168.200.129:8081 wight=3; # weight=3:权重3,承担3/4的请求
server 192.168.200.129:8082 backup; # backup:备用服务器,其他服务器忙/down时才启用
# 可选参数说明:
# down:暂时剔除该服务器(不参与负载)
# max_fails:允许请求失败的次数(默认1)
# fail_timeout:失败后暂停访问的时间(比如30s)
}
# 3.2 server块:每一个server就是一个虚拟主机站点(一个server对应一个网站/服务),包括server全局块、location块
server {
listen 80;#(HTTP默认端口,访问时可省略端口)
server_name localhost; # 域名(可填多个,用空格分隔,比如www.mysite.com localhost)
# 当请求 localhost:80 时,该请求会被匹配进该代码块的server{}中执行
# 3.3 location块:匹配请求路径,指定处理方式(核心中的核心)
location / {
root html; # 网站根目录(对应/usr/local/nginx/html)
index index.html index.htm; # 默认索引文件(访问目录时优先找这些文件)
}
# 错误页面配置,当请求的文件不存在时,返回404错误页面
error_page 404 /404.html;
# 定义/40x.html的位置
location = /40x.html {
# 此处可以配置额外的指令,如代理、重写等,但在此配置中为空
}
# 错误页面配置,当发生500、502、503、504等服务器内部错误时,返回相应的错误页面
error_page 500 502 503 504 /50x.html;
# 定义/50x.html的位置
location = /50x.html {
root html;
}
# 动态请求匹配到path为'api'(如http://localhost/api)的就转发给nginx-cluster处理
location /api {
proxy_pass http://nginx-cluster; # 负载均衡配置,请求会被平均分配到上面定义的集群
}
# ~表示以正则表达式进行匹配, (.*) 表示捕获MEDIA后的所有字符
location ~/wemedia/MEDIA/(.*) {
# 访问/wemedia/MEDIA/xxx时,转发到指定网关
proxy_pass http://heima-wemedia-gateway/$1; # $1对应上面捕获的参数
proxy_set_header HOST $host; # 保留原请求的主机名
proxy_pass_request_body on; # 允许转发请求体(比如上传文件)
proxy_pass_request_headers on; # 允许转发请求头
proxy_set_header X-Real-IP $remote_addr; # 告诉后端 真实发出请求的客户端IP, $remote_addr用以记录客户端的ip地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录代理链路
}
# 静态资源缓存:图片、文档等设置15天缓存(客户端本地缓存,减少服务器压力)
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{
expires 15d;
}
#对JavaScript和CSS文件设置缓存过期时间,客户端可以在24小时内使用本地缓存
location ~ .*.(js|css)?$
{
expires 24h;
}
# 允许访问/.well-known目录下的所有文件(通常用于WebFinger、OAuth等协议验证
location ~ /.well-known {
allow all;
}
# 禁止访问隐藏文件(即以点开头的文件或目录,比如.git,.env
location ~ /. {
deny all;
}
# 访问日志配置:记录所有访问请求到指定日志文件
access_log /user/logs/admin.log;
}
}
tip: http块可以配置多个server块(多个网站),每个server块中可以配置多个location块(不同路径的处理规则),灵活应对多服务场景。
五、Nginx实战配置:5个最常用场景
学会这5个实战配置,能覆盖80%的日常需求,
场景1:部署静态资源(HTML、图片、CSS等)
Nginx处理静态资源的效率远高于Tomcat,生产环境中,官网、博客等静态网站都用Nginx部署。
配置步骤
- 把静态文件(比如index.html、图片文件夹)放到
/usr/local/nginx/html目录; - 修改nginx.conf的server块:
server {
listen 80;
server_name www.mysite.com; # 你的域名
location / {
root /usr/local/nginx/html; # 静态文件存放目录
index index.html; # 默认首页(访问域名时直接显示index.html)
}
# 图片缓存30天,减少服务器压力
location ~* \.(jpg|png|gif)$ {
expires 30d; # 浏览器缓存30天,减少服务器负载和用户等待时间
}
}
修改完成后,执行nginx -t测试配置,再执行nginx -s reload生效,访问http://www.mysite.com就能看到静态页面了。
场景2:反向代理:隐藏真实服务器IP
比如你有一个Tomcat服务跑在192.168.1.100:8080,想让用户通过http://www.mysite.com访问(不用输8080端口),就用反向代理。
server {
listen 80;
server_name www.mysite.com;
location / {
proxy_pass http://192.168.1.100:8080; # 转发到Tomcat
proxy_set_header Host $host; # 告诉Tomcat真实域名
proxy_set_header X-Real-IP $remote_addr; # 告诉Tomcat真实用户IP
}
}
用户访问www.mysite.com时,完全感受不到Tomcat的存在,Nginx 会偷偷把请求转给 Tomcat,再把结果返回给用户。用户看不到真实服务器地址。
场景3:负载均衡:多服务器分担压力
如果网站访问量很大,一台服务器扛不住,就用多台服务器组成“集群”,让Nginx把请求均匀分发出去。
http {
# 定义服务器集群(叫mycluster)
upstream mycluster {
server 192.168.1.100:8080 weight=3; # 权重3(承担3/4请求)【性能好的服务器权重设置高】
server 192.168.1.101:8080; # 权重默认1(承担1/4请求)
}
server {
listen 80;
server_name www.mysite.com;
location / {
proxy_pass http://mycluster; # 转发到集群
}
}
}
这样,4 个请求中,3 个会发给 100 服务器,1 个发给 101 服务器,有效分担单台服务器的压力。
场景4:配置HTTPS(加密传输,让网址显示小绿锁)
HTTPS是安全的HTTP协议,需要SSL证书(阿里云、腾讯云可申请免费证书),配置后网址会显示“小绿锁”,保护用户数据传输安全。
server {
listen 443 ssl; # 监听443端口(HTTPS默认端口)
server_name example.com; # 你的域名
# 替换成你的SSL证书和私钥路径(从证书服务商处获取)
ssl_certificate /path/to/your/fullchain.pem; # 证书公钥文件
ssl_certificate_key /path/to/your/private.key;# 证书私钥文件
ssl_protocols TLSv1.2 TLSv1.3; # 支持的SSL协议版本(安全且兼容)
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; # 加密套件
ssl_prefer_server_ciphers on; # 优先使用服务器端的加密套件
location / {
root /path/to/your/https/static/files; # HTTPS对应的静态文件目录
index index.html index.htm;
}
}
配置完成后,访问https://example.com就能看到小绿锁了。如果需要强制HTTP跳转到HTTPS,可以再添加一个80端口的server块:
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri; # 强制跳转到HTTPS
}
场景五:安全防护配置
server {
listen 80;
server_name example.com;
location / {
# 防止 SQL 注入等攻击
rewrite ^/(.*)$ /index.php?param=$1 break;
# 限制请求方法,只允许 GET 和 POST
if ($request_method !~ ^(GET|POST)$ ) {
return 444;
}
# 防止跨站请求伪造
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
}
}
通过 rewrite 指令,可以防止一些常见的 Web 攻击,如 SQL 注入。这种限制请求方法,可以减少服务器被恶意利用的风险。同时,添加了一些 HTTP 头部来增强浏览器安全,如防止点击劫持和跨站脚本攻击(XSS)等。
六、负载均衡策略详解
Nginx支持多种负载均衡策略,根据业务场景选择合适的即可,用表格清晰总结:
| 策略 | 配置指令 | 核心特点 | 适用场景 |
|---|---|---|---|
| 轮询 | 默认(无需额外指令) | 均匀分配请求给每台服务器 | 所有服务器性能相近,无会话保持需求 |
| 权重 | weight=数值 |
按权重分配,权重越高,收到的请求越多 | 服务器性能差异大(高配置服务器权重高) |
| IP哈希 | ip_hash |
同一客户端IP固定访问一台服务器 | 需要会话保持(比如用户登录后不能切换服务器) |
| 最少连接 | least_conn |
请求优先分配给当前连接数最少的服务器 | 长连接服务(比如WebSocket) |
| URL哈希 | hash $request_uri |
相同URL固定服务器 | 静态资源缓存优化(同一资源只缓存一次) |
| 响应时间 | fair |
请求优先分配给响应速度最快的服务器 | 对响应速度要求高的场景(需安装第三方模块 |
常用策略配置示例
1. 权重策略(最常用)
upstream backend {
server backend1.example.com weight=3; # 设置backend1的权重为3
server backend2.example.com; # backend2的权重为默认值1
server backend3.example.com weight=5; # 设置backend3的权重为5
}
2. IP哈希策略(会话保持)
upstream backend {
ip_hash; # 启用IP哈希算法
server backend1.example.com;
server backend2.example.com;
}
3. URL哈希策略(缓存优化)
upstream backend {
hash $request_uri; # 启用URL哈希算法
server backend1.example.com;
server backend2.example.com;
}
根据请求的URL哈希值来决定将请求发送到backend1还是backend2。
4. fair 响应时间策略
upstream backend {
fair; # 启用公平调度算法
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
七、性能优化技巧
通过简单的配置调整,就能大幅提升Nginx的性能,
1. 工作进程优化(充分利用CPU)
worker_processes auto; # 自动匹配CPU核心数(比手动设置更灵活)
worker_cpu_affinity auto; # CPU亲和性(让进程绑定CPU核心,减少切换开销)
2. 连接数优化(提高并发能力)
events {
worker_connections 10000; # 提高每个进程的最大连接数(根据服务器配置调整)
use epoll; # Linux高性能事件模型(处理高并发的关键)
}
3. 缓冲优化(减少I/O开销)
http {
proxy_buffers 16 32k; # 代理缓冲区大小(16个32KB的缓冲区)
proxy_buffer_size 64k; # 代理缓冲区默认大小
}
4. Gzip压缩(减少传输体积)
http {
gzip on; # 开启Gzip压缩
gzip_types text/plain text/css application/json application/javascript; # 压缩的文件类型
gzip_min_length 1024; # 小于1KB的文件不压缩(避免浪费资源)
gzip_comp_level 6; # 压缩级别(1-9,级别越高压缩率越高,但CPU消耗越大)
}
八、常见问题解决方案
问题1:端口冲突(80/443端口被占用)
# 1. 查找占用80端口的进程
sudo lsof -i :80
# 2. 停止冲突的服务(比如Apache)
sudo systemctl stop apache2
# 3. 如果无法停止冲突服务,修改Nginx监听端口(比如把80改成8081)
server {
listen 8081; # 改为未被占用的端口
# 其他配置不变
}
问题2:静态资源访问403(权限不足)
403错误通常是目录/文件权限不足,或Nginx用户没有访问权限:
# 1. 给静态资源目录设置正确权限
chmod -R 755 /usr/local/nginx/html # 755:所有者可读写执行,其他人可读可执行
# 2. 确认Nginx用户权限(修改nginx.conf的全局块)
user www-data; # 确保该用户有访问静态资源目录的权限
问题3:负载均衡时请求分发不均
# 1. 检查服务器健康状态,确保所有服务器正常运行
# 2. 调整负载策略(比如改用least_conn)
upstream backend {
least_conn; # 优先分配给连接数最少的服务器
server backend1:80 max_fails=3 fail_timeout=30s; # 失败3次后,30秒内不再分配
server backend2:80 max_fails=3 fail_timeout=30s;
}
九、最佳实践总结
1. 分层配置:让配置更易维护
不建议把所有配置都写在nginx.conf里,推荐分层配置(Linux系统):
/etc/nginx/
├── nginx.conf # 主配置(全局、events、http基础配置)
├── conf.d/ # 通用配置(比如Gzip、负载均衡)
├── sites-available/ # 可用站点配置(所有网站的配置都放这里)
└── sites-enabled/ # 启用的站点(通过软链接关联sites-available的配置)
好处:新增/删除网站时,只需操作sites-enabled的软链接,不用修改主配置。
2. 安全加固:避免被攻击
- 定期更新Nginx版本,修复安全漏洞;
- 禁用不必要的模块(编译安装时用
--without-模块名); - 配置
WAF(比如ModSecurity),防御SQL注入、XSS等攻击; - 禁止访问隐藏文件(前面配置过的
location ~ /. { deny all; })。
3. 监控与日志:及时发现问题
http {
# 访问日志:用JSON格式,便于分析
access_log /var/log/nginx/access.log json;
# 错误日志:只记录警告及以上级别,减少日志体积
error_log /var/log/nginx/error.log warn;
# 启用Nginx状态监控(仅允许本地访问)
location /nginx_status {
stub_status; # 显示连接数、请求数等状态
allow 127.0.0.1; # 允许本地访问
deny all; # 禁止外部访问
}
}
访问http://localhost/nginx_status,就能看到Nginx的运行状态。
4. 性能测试工具:
# 1. Apache Bench(ab):压力测试工具(测试10000个请求,并发100)
ab -n 10000 -c 100 http://test.site/
# 2. 查看Nginx编译参数(确认启用的模块)
nginx -V
# 3. 查看完整配置(包括引入的其他文件)
nginx -T
总结与后续学习方向
通过本文,可以掌握Nginx的核心概念、安装配置、实战场景和优化技巧,足以应对日常开发中的大部分需求。
如果想进一步深入,可以学习这些方向:
- OpenResty:基于Nginx的Lua扩展,实现更复杂的业务逻辑(比如接口限流、灰度发布);
- Nginx集群:多台Nginx部署,实现高可用(避免单点故障);
- 日志分析:用ELK栈(Elasticsearch、Logstash、Kibana)分析Nginx日志,监控系统状态。
Nginx的核心是“简单高效”,新手不用追求一次性掌握所有功能,先把基础配置和实战场景用熟,再逐步深入即可~
更多推荐
所有评论(0)