nginx入门知识

Nginx 零基础入门指南:从安装到实战,前端后端都能看懂

开篇:写给所有想入门Nginx的同学

很多同学第一次接触Nginx,都会被「反向代理」「负载均衡」「异步非阻塞」这些词劝退——这都是什么东西?我一个前端/后端开发,为什么要学这个?

别慌,这篇文章就是为零基础的你准备的。不管你是前端还是后端,我都会用最通俗的大白话,把Nginx讲明白,让你的阅读体验像德芙巧克力一样丝滑,看完不仅能懂,还能直接上手用。

先给大家吃个定心丸:Nginx一点都不复杂,它的核心功能就那么几个,安装简单、配置简洁,却是互联网项目里无可替代的一环。


一、Nginx 到底是什么?

先看网上最常见的专业定义:

Nginx 是一款轻量级的 HTTP 服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的 IO 性能,时常用于服务端的反向代理负载均衡

是不是看完更懵了?没关系,我们先把这些术语全丢掉,用大白话讲清楚。

先搞懂两个基础概念

在讲Nginx之前,你只需要先分清两个东西:

  1. Web服务器(HTTP服务器):专门负责接收用户的网络请求,然后把结果返回给用户。就像餐厅的前台接待,客人来了先接需求,再把需求转给后厨,最后把做好的菜端给客人。常见的有Nginx、Apache、IIS。
  2. 应用服务器:专门跑业务代码、处理核心逻辑的服务器。就像餐厅的后厨,前台把客人的点单传过来,后厨负责炒菜、做饮品,做完再交给前台。常见的有Tomcat、Node.js服务、Java服务、Python服务。

现在你就能懂了:Nginx就是一个性能超强、超轻量的Web服务器

它是俄罗斯人伊戈尔·赛索耶夫在2004年开发的,最初是为俄罗斯访问量第二的Rambler.ru站点做的,经过二十多年的发展,已经成了全球最主流的Web服务器之一。

用一句话总结Nginx的核心特点

  • 轻量小巧:占用内存极少,启动速度毫秒级;
  • 并发能力拉满:异步非阻塞的设计(和Node.js的设计思路一模一样),能同时扛住几万甚至几十万的并发请求;
  • C语言开发:性能极强,稳定性超高;
  • 扩展性极强:第三方插件生态极其丰富,想实现什么功能基本都有现成的方案;
  • 互联网项目标配:百度、阿里、腾讯、京东、字节等几乎所有你知道的大厂,架构里都有Nginx的身影。

二、为什么前端后端都必须学Nginx?

先给大家看一组数据:全球约有三分之一的网站都在用Nginx,在国内高流量的互联网项目里,Nginx的使用率几乎是100%。

它不是运维专属的技能,而是后端的必修课,更是前端进阶的必经之路。

对后端同学来说

Nginx是服务端架构的第一道门,不管你是做Java、Go还是Node.js,项目上线必然要用到Nginx。反向代理、负载均衡、动静分离、接口限流、HTTPS配置,这些都是后端开发绕不开的内容。

对前端同学来说

掌握Nginx,能让你彻底跳出「页面仔」的局限:

  • 前端项目打包上线,需要Nginx做静态资源托管;
  • 本地开发跨域问题,Nginx反向代理是最通用的解决方案;
  • 前端性能优化,Nginx的gzip压缩、缓存配置、资源合并,是成本最低、效果最明显的优化手段;
  • 理解了Nginx,你才能站在更高的视角设计系统架构,而不是只局限在浏览器里的代码。

一句话总结:不管前端后端,Nginx都是你职场进阶的必备技能,早学早受益。


三、从零开始:Nginx 安装与基础操作

Nginx的安装极其简单,不同操作系统都有一键安装的方式,我们分最常用的Mac和Linux系统来讲。

(一)Mac系统:用Homebrew一键安装

Mac上最推荐用Homebrew安装,它就像前端的npm/yarn,一条命令就能搞定安装、卸载、启动、停止,全程不用管依赖和路径。

1. 先安装Homebrew(已安装可跳过)

如果你的Mac还没装Homebrew,先在终端执行这条命令:

1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

关于Homebrew的完整用法,可参考:Homebrew介绍和使用

2. 安装/卸载Nginx

1
2
3
4
5
6
7
8
# 安装Nginx
brew install nginx

# 卸载Nginx
brew uninstall nginx

# 若提示权限不足,在命令前加sudo即可,比如:
sudo brew install nginx

3. 验证安装是否成功

安装完成后,在终端执行:

1
nginx -v

如果输出了Nginx的版本号(比如nginx version: nginx/1.25.3),就说明安装成功了。

4. Mac上Nginx的核心路径

  • 安装目录:/usr/local/etc/nginx/
  • 默认配置文件:/usr/local/etc/nginx/nginx.conf
  • 静态资源默认目录:/usr/local/var/www/

(二)Linux系统:apt/yum一键安装

Linux系统(Ubuntu/Debian/CentOS)安装更简单,系统包管理器直接就能装:

1
2
3
4
5
# Ubuntu/Debian 系统
apt install nginx

# CentOS 系统
yum install nginx

Linux上Nginx的核心路径

  • 安装目录:/etc/nginx/
  • 主配置文件:/etc/nginx/nginx.conf
  • 站点配置目录:/etc/nginx/sites-available/(所有站点配置)、/etc/nginx/sites-enabled/(已启用的站点配置)

这里给大家讲一个Linux上Nginx的经典设计:

  • sites-available:存放所有站点的配置文件,不管这个站点要不要启用;
  • sites-enabled:只存放需要启用的站点配置,都是指向sites-available里配置文件的软链接。

比如你新增了一个站点nas.cszy.top,想启用它,只需要执行这行命令:

1
2
3
4
5
# 进入sites-enabled目录
cd /etc/nginx/sites-enabled

# 创建软链接,启用站点配置
ln -s ../sites-available/nas.cszy.top ./

想停用站点,直接删除软链接即可,不会删掉原配置文件,管理起来极其方便。

(三)Nginx 常用操作命令

不管是Mac还是Linux,这些核心命令都是通用的,记得权限不足时加sudo

命令 作用 适用场景
nginx 启动Nginx服务 首次安装后启动服务
nginx -s stop 快速停止Nginx 强制关闭服务,不管有没有正在处理的请求
nginx -s quit 优雅停止Nginx 等当前所有请求处理完再关闭,生产环境推荐用这个
nginx -s reload 热重启/重载配置 修改配置文件后,不重启服务就能让新配置生效,生产环境必备
nginx -t 校验配置文件语法 修改配置后,先执行这个命令检查有没有语法错误,避免配置写错导致服务挂掉
nginx -v 查看Nginx版本 验证安装是否成功
pkill -9 nginx 强制杀死Nginx进程 服务卡死,常规命令停不掉时使用

重点提醒:每次修改完Nginx配置,一定要先执行nginx -t检查语法,确认没问题再执行nginx -s reload重载配置,这是生产环境避坑的第一准则!


四、Nginx 核心配置入门

很多同学觉得Nginx配置复杂,其实它的配置结构极其清晰,核心就几个块,我们先搞懂最基础、最常用的部分。

配置文件的基本结构

Nginx的主配置文件nginx.conf,核心层级是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 全局块:配置Nginx全局生效的参数,比如运行用户、进程数、日志路径等
...

# events块:配置Nginx服务器与用户网络连接的相关参数,比如最大并发连接数
events {
...
}

# http块:配置HTTP服务器的核心参数,所有网站配置都在这个块里
http {
# http全局块:配置所有站点通用的参数,比如MIME类型、日志格式、gzip压缩、超时时间等
...

# server块:每一个server{}就是一个虚拟主机/一个网站,你可以配置无数个server块
server {
# server全局块:配置当前站点的参数,比如监听端口、域名、根目录
listen 8080; # 监听的端口
server_name localhost; # 匹配的域名/主机名

# location块:匹配请求的URL路径,不同路径执行不同的处理逻辑
location / {
root html; # 静态资源根目录
index index.html index.htm; # 默认首页文件,先找index.html,没有再找index.htm
}
}
}

是不是瞬间清晰了?我们用大白话翻译一下:

  • 当Nginx收到一个请求,先看请求的端口和域名,匹配到对应的server块;
  • 再看请求的URL路径,匹配到server块里对应的location块;
  • 最后按照location里的配置,处理这个请求(返回静态文件/转发到后端服务/拒绝访问等)。

举个最简单的例子:当你访问localhost:8080,Nginx会匹配到上面的server块,再匹配location /,然后去html目录里找index.html,把这个文件返回给浏览器。

这就是Nginx最核心的配置逻辑,90%的场景,都是围绕serverlocation块来写的。

官方文档参考:


五、Nginx 四大核心应用场景(附实战配置)

这部分是Nginx的核心,也是大家最关心的内容。我会用生活例子+大白话+可直接复制的配置,把每个场景讲透,看完你就能直接用到项目里。

场景一:动静分离

先搞懂什么是动静分离

我们先把网站的资源分成两类:

  • 静态资源:HTML、CSS、JS、图片、视频、字体文件等。这些文件不会变,用户请求的时候,直接把文件返回就行,不用跑业务逻辑。就像餐厅里的瓶装饮料,提前备好,客人点了直接拿。
  • 动态资源:接口请求、数据查询、业务逻辑处理等。这些请求需要后端服务跑代码、查数据库,才能返回结果。就像餐厅里的现炒菜,客人点了后厨才能做。

动静分离,就是让专业的人做专业的事:

  • 静态请求,直接由Nginx处理,从它的静态资源目录里把文件返回给用户,不用再转给后端服务;
  • 动态请求,Nginx再转发给后端的应用服务器(Node.js/Java/Go等)处理。

动静分离的好处

  1. 大幅减轻后端服务器压力:后端不用再处理静态资源请求,只需要专注写业务逻辑、处理接口,能省出大量性能;
  2. 前后端分离开发:前端代码打包后直接放在Nginx上,后端只需要提供接口,前后端可以并行开发、互不干扰,联调效率大幅提升;
  3. 提升静态资源访问速度:Nginx处理静态资源的性能,比任何后端应用服务器都强,还能配合gzip压缩、缓存策略,让用户打开页面的速度更快。

实战配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {  
listen 8080;
server_name localhost;

# 根路径匹配:返回前端打包后的静态页面
location / {
root /usr/local/var/www/my-project; # 前端打包后的dist目录路径
index index.html index.htm;
try_files $uri $uri/ /index.html; # 解决前端SPA项目路由刷新404的问题,必加!
}

# 静态资源匹配:所有后缀是这些的静态文件,都从my-project目录里取
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css|woff|woff2|ttf)$ {
root /usr/local/var/www/my-project;
expires 7d; # 静态资源缓存7天,优化性能
}

# 动态接口匹配:所有路径带/api/的请求,都转发给本地8002端口的后端服务
location /api/ {
proxy_pass http://localhost:8002; # 反向代理核心配置
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr; # 把用户真实IP传给后端
}
}

这个配置直接就能用:前端项目打包后放在/usr/local/var/www/my-project里,后端服务跑在8002端口,Nginx会自动区分静态和动态请求,完美实现动静分离。

参考资料:nginx动静分离的好处

场景二:反向代理

这是Nginx最核心的功能,也是大家最容易搞混的概念,我们先彻底搞懂「反向代理」和「正向代理」的区别。

先搞懂:什么是反向代理?

我用大家最熟悉的「代购」举例子,一秒就能懂:

  • 你想买一个国外的东西,自己买不了,于是找了一个代购。你把钱和需求给代购,代购去国外帮你买回来,再把东西交给你。
  • 这个过程里,你只需要对接代购,完全不用管代购是从哪个店、哪个渠道买的;卖家也只知道是代购买的,不知道最终是你买的。

反向代理,就是这个代购的角色:

  • 用户的请求先发给Nginx(代购),Nginx再把请求转发给后端的应用服务器(海外店铺),后端服务处理完,把结果给Nginx,Nginx再返回给用户。
  • 用户全程只和Nginx打交道,不知道背后有多少台后端服务、分别跑在哪个端口;后端服务也只接收Nginx的请求,不会直接暴露给用户。

反向代理的核心作用

  1. 保障服务安全:后端应用服务器不会直接暴露在公网,所有请求都要经过Nginx这一层,我们可以在Nginx里做权限控制、拦截恶意攻击、屏蔽非法IP,相当于给后端服务加了一层防护盾;
  2. 实现跨域:前端最头疼的跨域问题,用Nginx反向代理一行配置就能解决,是最通用、最稳定的跨域方案;
  3. 是负载均衡的基础:后面要讲的负载均衡,就是在反向代理的基础上实现的。

最简单的反向代理配置

1
2
3
4
5
6
7
8
9
10
11
12
13
server {  
listen 8080;
server_name localhost;

# 所有访问localhost:8080的请求,都转发给本地8000端口的服务
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 60s; # 连接超时时间
proxy_read_timeout 60s; # 读取超时时间
}
}

配置完重载Nginx,你访问localhost:8080,和直接访问localhost:8000的效果完全一样。这就是最基础的反向代理模型,所有复杂的反向代理配置,都是在这个基础上扩展的。

反向代理的应用极其广泛,我们平时用的CDN服务,就是反向代理最经典的场景之一。

场景三:负载均衡

先搞懂:什么是负载均衡?

还是用生活例子:一家奶茶店,周末人特别多,只有1个收银台,客人排起了长队,点单要等半小时。老板一看不行,赶紧又开了3个收银台,4个收银台一起接单,客人瞬间就不用排队了。

这个过程里,「把客人均匀分配到各个收银台,避免单个收银台压力过大」,就是负载均衡

对应到我们的系统里:

  • 业务量小的时候,一台后端服务器就够了;但随着用户越来越多,一台服务器扛不住了,我们就会多部署几台服务器,组成一个服务器集群
  • Nginx就是那个「大堂经理」,用户的请求先到Nginx,它会按照我们配置的规则,把请求均匀地分配给集群里的每一台服务器,避免单台服务器压力过大宕机。

负载均衡的核心作用

  1. 分摊集群压力:把海量的用户请求,分散到多台服务器上处理,大幅提升系统的并发承载能力;
  2. 保障服务高可用:Nginx自带健康检查功能,会定期给集群里的服务器发请求,检查服务是否正常。如果某一台服务器挂了,Nginx就不会再把请求发给它,只会把请求分给正常的服务器,用户完全感知不到有服务出问题了;
  3. 实现灰度发布:可以给不同的服务器设置权重,让小部分请求走新版本服务,大部分请求走旧版本,验证没问题再全量更新,极大降低上线风险。

参考资料:什么是集群(cluster)

实战负载均衡配置

最基础的轮询负载均衡配置,直接就能用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 先定义上游服务器集群,取名为domain
upstream domain {
server localhost:8000; # 第一台后端服务
server localhost:8001; # 第二台后端服务
# 可以加无数台,格式都是 server 服务地址;
}

# 2. 配置反向代理,把请求转发给集群
server {
listen 8080;
server_name localhost;

location / {
proxy_pass http://domain; # 把请求转发给上面定义的domain集群
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
}
}

配置完成后,你访问localhost:8080,Nginx会把请求轮流发给8000和8001端口的服务,完美实现负载均衡。

常用的负载均衡策略

Nginx内置了多种负载均衡策略,满足不同的业务需求:

  1. 轮询(默认):请求按顺序轮流分配给集群里的服务器,每台服务器分到的请求数量基本一致,适合所有服务器配置差不多的场景;
  2. 权重轮询:给服务器设置不同的权重,权重越高,分到的请求越多。比如配置server localhost:8000 weight=3; server localhost:8001 weight=1;,就是每4个请求里,3个给8000,1个给8001,适合服务器配置有差异的场景;
  3. IP哈希(ip_hash):根据用户的IP地址计算哈希值,同一个IP的用户,永远只会访问同一台后端服务器。完美解决session共享的问题,适合需要登录态的系统;
  4. 最少连接(least_conn):把请求分给当前连接数最少的服务器,避免某台服务器堆积太多请求,适合请求处理时间差异大的场景。

场景四:正向代理

搞懂了反向代理,正向代理就特别好理解了,它俩正好是反过来的。

还是用代购的例子:反向代理是「代理后端服务,对用户透明」,而正向代理是「代理客户端,对服务端透明」。

  • 你找代购买东西,店主只知道是代购买的,不知道是你买的——代购代理的是你(客户端),这就是正向代理。
  • 你找代购买东西,你只知道找代购,不知道东西是哪家店买的——代购代理的是店铺(服务端),这就是反向代理。

再举个最常见的例子:我们用的VPN/科学上网工具,就是典型的正向代理。

  • 你想访问国外的网站,直接访问不了,于是你连接了VPN。你的请求先发给VPN服务器,VPN服务器去访问国外的网站,再把内容返回给你。
  • 国外的网站只知道是VPN服务器访问的它,不知道是你访问的;全程你只需要对接VPN服务器,不用管网站能不能访问。

正向代理的核心定义:代理服务器位于客户端和目标服务器之间,客户端指定要访问的目标服务器,代理服务器转发请求并返回结果,目标服务器感知不到真实客户端的存在。

正向代理的应用场景没有反向代理广泛,主要用于VPN、内网穿透、客户端访问控制等场景,入门阶段大家只需要搞懂它和反向代理的区别就够了。


六、写在最后

这篇文章里,我们从Nginx是什么、为什么要学,到安装、基础命令、核心配置,再到四大核心应用场景,把Nginx入门的所有核心内容都讲透了。

很多同学觉得Nginx高深,其实它的核心逻辑特别简单:接收请求,匹配规则,处理请求,返回结果。所有复杂的配置,都是在这个基础上做的扩展。

对于入门来说,你不需要记住所有的配置指令,只需要搞懂核心逻辑,知道什么场景用Nginx的什么功能,具体的配置用的时候查文档就可以了。

最后给新手同学两个学习建议:

  1. 实践出真知:本地装一个Nginx,跟着文章里的配置敲一遍,改一改参数,重载看看效果,比看十遍文章都管用;
  2. 先会用,再深入:先把常用的动静分离、反向代理、负载均衡用熟,再去研究更复杂的功能,循序渐进,才是最高效的学习方式。

希望这篇文章,能帮你彻底推开Nginx的大门。


nginx入门知识
https://cszy.top/20240228-nginx入门知识/
作者
csorz
发布于
2024年2月28日
许可协议