Nginx
# 概述
Nginx是一个高性能的HTTP和反向代理web服务器 , 同时也提供了 IMAP/POP3/SMTP 服务
正向代理&反向代理 正向代理要知道访问服务器的地址,反向代理不需要知道访问服务器的真实地址
优点 :
- 反向代理能够将请求进行 负载均衡
- 有多种 均衡策略
官网 : https://nginx.org (opens new window)
中文文档 : https://blog.redis.com.cn/doc/index.html (opens new window)
# 安装
下载 : https://nginx.org/en/download.html
一般下载稳定版即可
# Window
解压后 , cmd根路径 ==start nginx==/==nginx.exe== 指令即可食用
验证 : http://localhost:80
window常用指令
# 启动&退出&关闭&重启 服务
start nginx
nginx -s quit
nginx -s stop
nginx -s reopen
# 帮助
nginx -h
注意 :
- 解压路径中不能包含有中文路径
- Nginx配置是80端口 , 如果加载无效需要更改端口 配置文件 ==/conf/nginx.conf== 看见 ==listen 80;== 更改即可
# Linux
安装
# 安装
yum install epel-release
yum update
yum -y install nginx
# nginx服务 开启/停止/重启
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
配置
- ==/etc/nginx/nginx.conf==文件
- ==/etc/nginx/conf.d/自定义文件.conf==文件 (一般在这里新建应用)
验证 : http://localhost:80
# 配置
Nginx配置中有三个核心功能 :
- 静态服务器
- 反向代理
- 负载均衡
# 常用语法
server
块定义了一个虚拟主机的配置location
块用于匹配 URL 并定义如何处理请求listen
指令用于指定服务器监听的端口server_name
指令用于指定服务器的域名root
指令用于指定网站文件的根目录index
指令用于指定默认页面
# 全局配置
main
# 工作模式配置
events { }
# http 配置
http {
# 服务器主机配置
server {
# 端口
listen 80;
# 域名
server_name localhost 192.168.1.100;
# 代表这是项目根目录
location / {
# 虚拟根目录
root /usr/share/nginx/www;
}
}
# 路由配置
location { }
# 负载均衡配置
upstream name { }
}
配置文档 :
- http://www.gwznkj.cn (opens new window)
- http://shouce.jb51.net/nginx/left.html (opens new window)
- https://blog.csdn.net/qq_33454884/article/details/89212702 (opens new window)
# 静态资源代理
将主机中的静态资源挂到外部访问
通过以下三大指令访问 :
alias
为特定的 location块指定一个替代路径try_files
尝试不同的文件路径或 URI,直到找到存在的文件或目录root
定义所有请求的基础路径
# alias
请求url指定别名路径应用
location /static/ {
alias /path/to/your/static/files/;
}
请求url的所有 /static/
路由的请求 , 都被映射到 /path/to/your/static/files/
目录
PS : alias
指令 不会继承 root
指令 设置的根路径,因为它直接指向文件系统的绝对路径或相对于根目录的路径
# try_files
指定文件列表去找指定文件
location / {
try_files $uri $uri/ /index.html;
}
Nginx 会尝试按照 $uri
(请求的原始 URI)、$uri/
(作为目录处理)、/index.html
的顺序查找文件
一般情况会搭配root使用
# 在 /var/www/html/目录下 查找index.html
location / {
root /var/www/html;
try_files $uri $uri/ /index.html;
}
PS : server
块中设置 root
指令时 , 它会影响该服务器块下所有 location
块的文件查找路径 , 除非在 location
块中明确指定了 root
或 alias
# root
指定根目录 , 指向nginx查目录从哪里开始
location /images/ {
root /var/www;
}
请求url的所有 /images/
的请求都会从 /var/www/images/
目录中查找文件
当root放在server块时
server {
listen 80;
server_name www.example.com;
root /var/www/html;
# 静态资源也可直接访问 www.example.com/app/static/js/xxx.js , 实际路径 /var/www/html/app/static/js/xxx.js
# 在 /var/www/html/目录下 查找index.html
location / {
try_files $uri $uri/ /index.html;
}
}
# 反向代理
在 server
块中使用 location
指令 将请求url转发到指定服务
常用配置
location / {
proxy_pass http://backend_server;
# proxy_set_header指令 用于修改或添加 转发到后端服务器的 HTTP头部
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
涉及指令
指令 | 值 | 说明 |
---|---|---|
proxy_pass | IP、域名、变量 | 代理来源的目标服务 |
proxy_set_header | HeaderName Value | 修改或添加 转发到目标服务的HTTP头部 |
proxy_redirect | off、http://old.com/、http://new.com/ | 重定向域名 |
proxy_http_version | 1.1 | 指定通信使用的 HTTP 版本 |
proxy_connect_timeout | 90 (单位: s) | 通信连接 超时时长 |
proxy_send_timeout | 90 (单位: s) | 请求发送 超时时长 |
proxy_read_timeout | 90 (单位: s) | 读取响应 超时时长 |
# 负载均衡配置
通过 upstream
实现多台主机服务
基本用法
http{
upstream myweb {
# 两个服务器
server localhost:8080;
server localhost:8081;
}
server {
listen 80;
# 路由对应
location / {
proxy_pass http://myweb;
}
}
}
需要对应路由才能进行访问后端指定路由
权重
根据权重进行为请求分流 , 以下配置 权重比 3 : 7 的比例进行分流
upstream backend {
server backend1.example.com weight=3;
server backend2.example.com weight=7;
}
备用
当其他主机不可用时才会采用 backend2
upstream backend {
server backend1.example.com;
server backend2.example.com backup;
}
健康
定期健康检查 , 会将不可用会被移出服务器池!
upstream backend {
server backend1.example.com;
server backend2.example.com;
# 健康检查
health_check;
# 健康配置的参数
# 检查时 , 超时时间 , 超时 标记不可用
health_check_timeout 5s;
# 健康时间 间隔
health_check_interval 10s;
# 请求 判断状态 200(如果不是200,标记不可用)
health_check_status 200;
# 请求 判断响应正文 success(如果不是success,标记不可用)
health_check_match "success";
# 标记不可用前 , 条件 : 重检失败 3次
health_check_fails 3;
# 标记可用前 , 条件 : 重检成功 2次
health_check_healthy_threshold 2;
}
# 分配策略
upstream
模块 提供了一下轮询策略 :
轮询
默认的负载均衡策略 , 每台服务器都跑一遍 , 按循序执行
哈希分配
根据 变量 计算出hash值 , 通过hash分配请求 , 保证同一请求同一主机
最少连接
将请求分配给当前连接数最少的服务器 , 请求会分配给最空闲的服务器
公平
根据主机响应时长来动态调整权重 , 使得响应时间较短的服务器获得更多的请求
随机
随机选择一台主机处理请求
哈希策略
自定义对象Hash
upstream backend {
# 计算uri的 hash值
# consistent作用 : 保证服务器 增加/删除 的情况下 , 保证hash值稳定性
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
}
最小连接策略
upstream backend {
# 使用 Least Connections 策略
least_conn;
server backend1.example.com;
server backend2.example.com;
}
公平策略
upstream backend {
# 使用 Fair 策略
fair;
server backend1.example.com;
server backend2.example.com;
}
随机策略
upstream backend {
# 使用 Random 策略
random;
server backend1.example.com;
server backend2.example.com;
}
# Docker应用
利用docker安装nginx实现反向代理
安装镜像
nginx
创建配置文件 (运行docker挂载的配置)
# 创建挂载目录 mkdir -p /home/nginx/conf mkdir -p /home/nginx/log mkdir -p /home/nginx/html
拷贝主要配置到宿主机
# 生成容器 docker run --name nginx -p 9001:80 -d nginx # 将容器nginx.conf文件复制到宿主机 docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf # 将容器conf.d文件夹下内容复制到宿主机 docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d # 将容器中的html文件夹复制到宿主机 docker cp nginx:/usr/share/nginx/html /home/nginx/
运行 Nginx容器
docker run \ -p 9002:80 \ --name nginx \ -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /home/nginx/conf/conf.d:/etc/nginx/conf.d \ -v /home/nginx/log:/var/log/nginx \ -v /home/nginx/html:/usr/share/nginx/html \ -d nginx:latest
访问 [IP]:9002 即可
命令 | 说明 |
---|---|
-name [名称] | 命名 |
-d | 后台运行 |
-p [宿主端口]:[容器端口] | 端口映射 |
-v [宿主路径]:[容器路径] | 配置文件挂载 |
nginx:latest | 本地运行的版本 |
\ | shell 命令换行 |
# Nginx Proxy Manger
官方 : https://nginxproxymanager.com/
Nginx 的进化 , 简化了Nginx操作 , 图形化UI操作
← TypeScript Sass→