Nginx是一款高性能的HTTP 和反向代理服务器,同时也可作为负载均衡器、缓存服务器和邮件代理服务器使用。
1. 正向代理和反向代理
1.1 正向代理
正向代理是客户端侧的代理服务器,它的核心作用是:代替客户端向目标服务器发起请求,隐藏客户端的真实身份,或解决客户端无法直接访问目标服务器的问题。
核心特征
- 代理对象是客户端:客户端明确知道自己在使用代理,且需要手动配置代理地址(比如浏览器、手机设置里填代理 IP 和端口)。
- 目标服务器 "不知情":目标服务器收到的请求来自代理服务器,无法直接获取客户端的真实 IP(只能看到代理的 IP)。
- 解决 "客户端访问限制":比如客户端所在网络屏蔽了某些网站(如境外资源),通过正向代理可绕过限制;或客户端需统一通过代理进行权限验证、流量管控。
典型场景
- 个人使用 VPN 访问境外网站(VPN 本质是一种正向代理,客户端连接 VPN 服务器后,所有请求通过 VPN 转发)。
- 企业内网员工通过公司统一的正向代理服务器访问互联网(企业借此管控员工上网权限、记录上网日志)。
- 开发中通过代理工具(如 Charles、Fiddler)抓包,查看客户端与服务器的通信数据(代理工具扮演正向代理角色)。
1.2 反向代理
反向代理是服务器侧的代理服务器,它的核心作用是:代替后端真实服务器接收客户端的请求,再将请求转发给合适的后端服务器,同时隐藏后端服务器的真实信息。
核心特征
- 代理对象是后端服务器:客户端 "不知情"------ 客户端不需要配置任何代理,只需要像访问普通网站一样访问反向代理服务器的地址(反向代理的 IP / 域名就是用户感知的 "网站地址")。
- 客户端 "不知情":客户端不知道后端有多少台真实服务器,也不知道自己的请求最终被转发到了哪台服务器,以为自己直接和 "反向代理" 交互。
- 解决 "服务器服务限制":比如后端有多台服务器(集群),通过反向代理实现负载均衡;或隐藏后端服务器 IP,防止直接被攻击;或统一处理 SSL 加密、静态资源缓存等共性需求。
典型场景
- 负载均衡:大型网站(如淘宝、京东)后端有上千台服务器,客户端请求先到反向代理(如 Nginx、Apache),代理再根据服务器负载情况,将请求转发给压力较小的后端服务器,避免单台服务器过载。
- 隐藏后端服务器:后端服务器不直接暴露公网 IP,只允许反向代理访问,降低被黑客攻击的风险(比如 SQL 注入、DDoS 直接攻击后端的概率)。
- 统一 SSL 加密:所有客户端的 HTTPS 请求先到反向代理,由反向代理完成 SSL 证书的解密(将 HTTPS 转为 HTTP),再转发给后端服务器 ------ 后端服务器无需单独配置 SSL,减少重复工作。
- 静态资源缓存:反向代理将后端返回的静态资源(如图片、CSS、JS)缓存起来,后续客户端请求相同资源时,直接从代理返回,无需再转发给后端,提升访问速度。
2. 安装Nginx
2.1 windows安装
https://nginx.org/en/download.html
来到nginx官网点击链接即可下载


解压后双击nginx.exe文件即可运行nginx,运行之后可以访问本机ip的80端口,如果看到以下内容说明运行成功了

2.2 Linux安装

在官网点击红框处的链接即可下载,下载后上传服务器输入命令:
bash
tar -zxvf nginx-1.xx.x.tar.gz
进行解压:

解压完成后可以看到多了个文件夹:

执行命令:
bash
#配置
./configure
#构建
make
#安装
make install
执行完毕后就安装好了,也可也使用yum命令安装更为方便。
执行 whereis nginx可以看到nginx安装的位置:

启动文件在sbin目录下,执行成功后可以使用curl命令访问80端口 测试是否执行成功:

输出了网页说明成功了
3. Nginx常用命令
bash
./nginx #启动
./nginx -s stop #强制停止
./nginx -s quit #安全退出
./nginx -s reload #重新加载配置文件(nginx.conf)
ps aux | grep nginx #查看nginx进程
4. Nginx配置文件
nginx的使用需要操作其配置文件:
配置文件在nginx安装目录中的conf目录下:

图中的nginx.conf就是我们需要操作的配置文件:
bash
#user nobody;
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
# 事件区块开始
events {
#单个进程最大连接数(最大连接数=连接数*进程数)
#根据硬件调整,和前面工作进程配合起来用
worker_connections 1024;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#include:导入外部文件mime.types,将所有types提取为文件,然后导入到nginx配置文件中
include mime.types;
#默认文件类型
default_type application/octet-stream;
#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 logs/access.log main;
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,
#对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off
#以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
#sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件
#对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off
#以平衡磁盘与网络IO处理速度,降低系统uptime。
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
#长连接超时时间,单位是秒
keepalive_timeout 65;
#gzip on;
# 第一个Server区块开始,表示一个独立的虚拟主机站点
server {
# 提供服务的端口,默认80
listen 80;
# 提供服务的域名主机名
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#对 "ip:80/" 启用反向代理,第一个location区块开始
#可以添加多个loaction块用于代理不同路径的请求
location / {
root html; #服务默认启动目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
#root html; 和 index 配置在反向代理场景中,通常作为 "备选方案"
#当 proxy_pass 指向的后端服务不可用时
#Nginx 可能会尝试返回本地 html 目录下的静态文件(具体取决于错误处理配置)。
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
# 错误页面路由
error_page 500 502 503 504 /50x.html; # 出现对应的http状态码时,使用50x.html回应客户
location = /50x.html { # location区块开始,访问50x.html
root html;# 指定对应的站点目录为html
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
其中重要部分我都做了注释
5. 配置负载均衡和反向代理
假设我们有两台服务器,上面运行了相同的服务,那么我们就可以使用nginx做负载均衡来转发请求到两台服务器上:

配置之后,需要重新加载配置文件使用上面提到的命令:nginx -s reload 我们访问本地80端口请求就会被转发到 upstream配置的server中