在日常的项目开发与部署过程中,端口映射、请求转发、服务负载均衡等需求十分常见,而 Nginx 作为一款轻量级的 Web 服务器、反向代理服务器,凭借高性能、高并发、配置灵活等特性,成为解决这类问题的首选工具。本文将从实际开发场景出发,详细讲解 Nginx 的核心概念、安装配置及实战应用。
一、为什么需要 Nginx?
在前端项目开发中,我们通常会遇到这样的问题:本地开发的项目需要通过http://manage.powershop.com:8080访问,带端口的访问方式不够优雅,且生产环境中用户习惯直接通过域名(默认 80 端口)访问。此外,在多服务器部署场景下,还需要解决请求分发、静态资源高效访问等问题。
Nginx 的核心能力恰好能解决这些问题:
- 反向代理:将 80 端口的请求转发到后端应用的指定端口;
- 负载均衡:将请求分摊到多台后端服务器,提升系统吞吐量;
- 动静分离:将静态资源(图片、JS、CSS)直接由 Nginx 提供,减轻应用服务器压力。
二、Nginx 核心概念解析
2.1 反向代理
代理服务分为正向代理和反向代理,核心区别在于代理的 "目标对象" 不同:
- 正向代理:代理客户端(用户)访问外部网络,比如 VPN、NAT,客户端明确知道代理服务器的存在;
- 反向代理:代理服务器接收外部客户端的请求,转发给内部的应用服务器,再将结果返回给客户端。客户端感知不到代理的存在,仅认为是直接访问代理服务器。
反向代理是 Nginx 最常用的功能,比如将http://manage.powershop.com(80 端口)的请求转发到本地127.0.0.1:8080的前端项目,实现无端口访问。
2.2 负载均衡
当单台应用服务器无法承载高并发请求时,可部署多台服务器组成集群,Nginx 通过负载均衡将请求分摊到不同服务器,避免单台服务器过载。常见的负载均衡策略包括:
- 轮询(默认):请求按顺序依次分配给不同服务器;
- weight(权重):为不同服务器设置权重,权重越高,分配到的请求越多;
- ip_hash:根据客户端 IP 分配服务器,确保同一 IP 始终访问同一服务器,解决 session 共享问题;
- least_conn:优先分配请求到连接数最少的服务器;
- fair:按服务器响应时间分配,响应时间越短优先级越高;
- url_hash:根据请求 URL 分配服务器,相同 URL 定向到同一服务器。
2.3 动静分离
Web 服务器分为应用服务器(如 Tomcat、Jetty)和静态服务器(如 Nginx、Apache),应用服务器擅长处理动态请求(如 JSP、接口),但处理静态资源(图片、CSS、JS)的效率远低于静态服务器。
动静分离即:将静态资源部署在 Nginx 服务器,动态请求转发到应用服务器,大幅提升资源访问效率。
三、Nginx 安装(Linux 环境)
3.1 安装依赖库
Nginx 编译依赖 gcc、pcre、zlib、openssl 等库,执行以下命令安装:
shell:
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
3.2 下载并解压 Nginx
从 Nginx 官网(http://nginx.org/)下载稳定版安装包,解压到指定目录:
shell:
# 解压安装包(以1.10.0版本为例)
tar -zxvf nginx-1.10.0.tar.gz
cd nginx-1.10.0
3.3 配置并编译安装
指定安装目录(如/usr/local/nginx),执行配置、编译和安装:
shell:
# 配置安装路径
./configure --prefix=/usr/local/nginx
# 编译并安装
make && make install
3.4 Nginx 目录结构
安装完成后,目录结构如下(核心目录):
plaintext:
/usr/local/nginx/
├── conf # 所有配置文件目录,核心为nginx.conf
├── html # 默认静态资源目录(含index.html、50x.html)
├── logs # 日志目录(access.log访问日志、error.log错误日志)
├── sbin # 可执行文件目录(nginx启动/停止命令)
四、Nginx 基本操作
4.1 启动 Nginx
进入sbin目录,执行启动命令:
shell:
cd /usr/local/nginx/sbin
./nginx
启动后可通过curl http://localhost测试,返回 Nginx 默认页面即启动成功。
4.2 关闭 Nginx
shell:
# 强制停止
./nginx -s stop
# 优雅停止(处理完当前请求后停止)
./nginx -s quit
4.3 重载配置文件
修改配置文件后,无需重启 Nginx,直接重载即可:
shell:
./nginx -s reload
五、Nginx 核心配置实战
Nginx 的核心配置文件为/usr/local/nginx/conf/nginx.conf,以下是常见场景的配置示例。
5.1 反向代理:域名转发到指定端口
需求:将manage.powershop.com(80 端口)的请求转发到本地127.0.0.1:8080的前端项目。
nginx.conf:
worker_processes 1; # 工作进程数,建议等于CPU核心数
events {
worker_connections 1024; # 单个进程最大连接数
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on; # 开启高效文件传输模式
keepalive_timeout 65; # 连接超时时间
server {
listen 80; # 监听80端口
server_name manage.powershop.com; # 监听的域名
# 设置请求头
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 所有请求转发到8080端口
location / {
proxy_pass http://127.0.0.1:8080; # 反向代理地址
proxy_connect_timeout 600; # 连接超时时间
proxy_read_timeout 600; # 读取超时时间
}
}
}
5.2 负载均衡:代理多台 Tomcat 服务器
需求:将请求分摊到两台 Tomcat 服务器(127.0.0.1:8080和127.0.0.1:8081)。
nginx.conf:
http {
# 定义后端服务器集群
upstream tomcat_cluster {
server 127.0.0.1:8080 weight=2; # 权重2,分配更多请求
server 127.0.0.1:8081 weight=1; # 权重1
ip_hash; # 同一IP固定访问同一服务器,解决session问题
}
server {
listen 80;
server_name manage.powershop.com;
location / {
proxy_pass http://tomcat_cluster; # 转发到集群
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
}
5.3 动静分离:静态资源由 Nginx 直接提供
需求:所有图片请求(.gif/.jpg/.png/.jpeg)直接访问 Nginx 的/usr/upload/images目录,无需转发到应用服务器。
nginx.conf:
server {
listen 80;
server_name manage.powershop.com;
# 静态资源匹配规则
location ~* \.(gif|jpg|png|jpeg)$ {
root /usr/upload/images; # 静态资源根目录
expires 30d; # 设置缓存时间,减轻服务器压力
}
# 动态请求转发到Tomcat
location / {
proxy_pass http://127.0.0.1:8080;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
六、Windows 环境快速使用 Nginx
开发阶段可直接使用 Windows 版 Nginx(免安装):
- 下载 Windows 版 Nginx 解压到本地;
- 修改
conf/nginx.conf配置(同 Linux); - 启动 Nginx:双击解压目录下的
nginx.exe,或在命令行执行nginx.exe; - 停止 Nginx:命令行执行
nginx.exe -s stop; - 重载配置:
nginx.exe -s reload。
七、总结
Nginx 作为高性能的反向代理服务器,核心价值体现在反向代理、负载均衡和动静分离三个方面:
- 反向代理解决域名与端口映射问题,实现优雅的域名访问;
- 负载均衡提升系统并发能力,避免单服务器瓶颈;
- 动静分离优化资源访问效率,减轻应用服务器压力。
掌握 Nginx 的核心配置和常用操作,能大幅提升项目部署的灵活性和系统性能,是后端开发、运维工程师必备的技能之一。