## nginx 配置小结
> 原文:[https://www.cnblogs.com/CraryPrimitiveMan/p/6568032.html](https://www.cnblogs.com/CraryPrimitiveMan/p/6568032.html) -- 疯狂原始人
前两天区听了一堂Nginx的课,然后翻了一下自己之前的Nginx的笔记,做了一个简单的小结。
## 全局变量
$args : 这个变量等于请求行中的参数,同`$query_string`
$content\_length : 请求头中的`Content-length`字段
$content\_type : 请求头中的`Content-Type`字段
$document\_root : 当前请求在`root`指令中指定的值
$host : 请求主机头字段,否则为服务器名称
$http\_user\_agent : 客户端`agent`信息
$http\_cookie : 客户端`cookie`信息
$limit\_rate : 这个变量可以限制连接速率
$request\_method : 客户端请求的动作,通常为`GET`或`POST`
$remote\_addr : 客户端的`IP`地址
$remote\_port : 客户端的端口
$remote\_user : 已经经过`Auth Basic Module`验证的用户名
$request\_filename : 当前请求的文件路径,由`root`或`alias`指令与`URI`请求生成
$scheme :`HTTP`方法(如`http`,`https`)
$server\_protocol : 请求使用的协议,通常是`HTTP/1.0`或`HTTP/1.1`
$server\_addr : 服务器地址,在完成一次系统调用后可以确定这个值
$server\_name : 服务器名称
$server\_port : 请求到达服务器的端口号
$request\_uri : 包含请求参数的原始`URI`,不包含主机名,如`/foo/bar.php?arg=baz`
$uri : 不带请求参数的当前`URI`,`$uri`不包含主机名,如`/foo/bar.html`
$document\_uri : 与`$uri`相同
**假设请求为`http://www.qq.com:8080/a/b/c.php`,则 **
```
$host:www.qq.com
$server_port:8080
$request_uri:[http://www.qq.com:8080/a/b/c.php](http://www.qq.com:8080/a/b/c.php)
$document_uri:/a/b/c.php
$document_root:/var/www/html
$request_filename:/var/www/html/a/b/c.php
```
## 主机名(server\_name)匹配
从上到下的优先级为从高到低
1. 明确的`server_name`名称,如`www.qq.com`
2. 前缀通配符,如`*.qq.com`或`. qq.com`
3. 后缀通配符,如`www.qq.*`
4. 正则表达式,如`~[a-z]+\.qq\.com`
## Location查找规则
从上到下的优先级为从高到低
1. 等号类型,精确匹配,如`location = / {}`
2. `^~`类型,前缀匹配,不支持正则,如`location ^~ /user {}`
3. `~`和`~*`类型,正则匹配,`~`区分大小写,`~*`不区分大小写,如`location ~ ^/user {}`
4. 常规字符串匹配类型,如`location / {}`或`location /user {}`
## Try\_files规则
try\_files $uri $uri/ /index.php
假设请求为`http://www.qq.com/test`,则`$uri`为`test`
1. 查找`/$root/test`文件
2. 查找`/$root/test/`目录
3. 发起`/index.php`的内部“子请求”
## Rewrite规则
rewrite ^/images/(.\*).(png|jpg|gif)$ /images?name=$1.$4 last;
上面的`rewrite`规则会将文件名改写到参数中
last : 相当于`Apache`的\[L\]标记,表示完成`rewrite`
break : 停止执行当前虚拟主机的后续`rewrite`指令集
redirect : 返回302临时重定向,地址栏会显示跳转后的地址
permanent : 返回301永久重定向,地址栏会显示跳转后的地址
## 负载均衡
例子如下
```
upstream backend1 {
server backend1.qq.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3 backup;
}
upstream backend2 {
ip_hash;
server backend1.qq.com;
server backend2.qq.com;
server backend3.qq.com down;
server backend4.qq.com;
}
server {
location / {
proxy_pass http://backend1;
}
location /api {
proxy_pass http://backend2;
}
}
```
## 查看一个实例
下面是一个`laravel`框架`Nginx`配置的例子,听过这堂课终于了解了下面的原理。
~~~
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
# 设定网站根目录
root /var/www/laravel/public;
# 网站默认首页
index index.php index.html index.htm;
# 服务器名称,server_domain_or_IP 请替换为自己设置的名称或者 IP 地址
server_name server_domain_or_IP;
# 修改为 Laravel 转发规则,否则PHP无法获取$_GET信息,提示404错误
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP 支持
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
~~~
我们主要关注两个`location`,假设地址是`http://www.qq.com/user/info`,会匹配到如下`location`
~~~
location / {
try_files $uri $uri/ /index.php?$query_string;
}
~~~
由于`$uri`和`$uri/`是不存在的,所以会走`/index.php?$query_string`,这时候会发起一个内部“子请求”,“子请求”会重新匹配`location`,然后匹配到如下`location`
~~~
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
~~~
这样请求就会发送到`fastcgi`去做处理。
- 前言
- Android
- 签名证书生成
- JavaScript
- WebSocket 协议心跳
- 选择预览本地图片(不上传)
- Ajax 上传文件
- 代码片
- js 播放声音
- Verify 验证
- 验证金额 / 限制保留两位小数
- 原型链&继承
- 经典算法
- 冒泡排序
- 递归算法
- 二分查找
- 帮助函数
- 取URL查询参数为对象
- Date 日期时间
- 浅拷贝与深拷贝
- 进制转换
- Canvas
- 画圆形头像
- 计算字符串宽度
- 常用第三方包
- XLSX
- Layui
- layer.open select 遮挡问题
- 模板中使用 JS 表达式
- Form 表单
- on 监听事件
- select 下拉选择框
- 取表单数据 / 置表单数据
- form.verify 表单验证
- address 三级联动
- Table 表格
- 动态添加表格行
- 设置行高
- 单元格显示图片
- 开启编辑-阻止用户修改
- 主动触发事件
- 文件上传
- 单图上传
- Vue
- Vue.js 代码片
- 模态框/弹出层
- 单页面电影院选座
- vuex
- WebSocket聊天模板
- 解决办法
- vue-router多级路由中无父级组件设置方法
- Mui
- vue2+mui实现上拉刷新下拉加载
- JQuery
- 序列号表单为 JSON 对象
- Ajax 网络请求
- 选择器
- 插件
- selectpage
- HTML+CSS 布局
- Nodejs
- flex 布局
- 水平对齐方式
- 垂直对齐方式
- 九宫格/列表
- PHP
- gd 图像处理
- 图片写字
- 图片合并
- 图像压缩
- 图片写字居中
- 超全局变量
- helper 帮助函数
- ThinkPHP
- 生成用户分享二维码
- tp5.0 模型关联查询field无效
- Composer
- phpmailer
- 第三方接口
- 快递 100 物流记录
- 动态加载
- pdf解决方案
- 图片转换pdf
- 阿里云
- OSS 对象储存
- 阿里短信
- 辅助函数
- 取两个数组差异部分
- 从完整地址中取出省市区
- 钉钉
- 进制转换 & pack/unpack
- Yii2
- ActiveForm 常见问题
- FastAdmin
- layer的妙用
- \fast\Auth 权限
- 前端的各种常见问题
- 点击图片放大预览
- js
- ajax请求
- 前端
- Table
- selectPage
- 后端
- 腾讯cos插件后台上传文件工具类
- XDebug
- php.ini
- Linux
- RabbitMQ
- 防火墙
- iptables
- firewalld
- 环境变量
- shell
- bash
- crontab 定时任务
- 数据归档与解压缩
- tar
- 图像处理
- imagemagick
- 文档表格处理
- 转换word、pdf等
- 常用命令
- 文件资源管理
- xxd 十六进制编辑与查看
- 疑难杂症
- 开启swap虚拟文件系统缓解内存紧张卡顿
- wine
- deepin-wine(qq/微信综合)
- Python
- 代码片
- bs4 解析 html 插入到数据库
- webdriver 操作浏览器
- requests 请求库
- easyxlsx 导出 excel
- opencv
- 提取印章
- orc图片文字识别
- tesseract
- 进制转换
- WebSocket
- ws 服务示例
- 进程守护
- PM2
- Golang
- net/http
- Server
- 基本
- array 数组
- 循环
- os 文件目录基本操作
- map
- json处理
- Qrcode 二维码
- go-sqlite3
- go-redis
- mysql
- go-sql-driver
- 正则表达式
- beego
- fmt
- io
- ioutil
- net
- http
- Docker
- docker run
- Nginx
- CORS 允许跨域配置
- 负载均衡&反向代理
- rewaite 重写
- nginx配置
- 易语言
- 汇编 call 执行子程序
- HpSocketTcp 大文件传输
- 类指针
- Vim
- UniApp
- request.js
- 微信小程序登录处理(oauth2)
- vuex
- WebSocket聊天
- 腾讯云-人脸核身
- Java
- Spring Boot
- 请求与响应
- nginx部署
- 配置文件
- 创建项目
- 控制器
- 一个控制器示例
- 数据库
- MySQL
- 集成 SLF4J
- 集成 PageHelper 分页
- maven
- Markdown
- mermaid
- ffmpeg
- 基本使用
- 介绍/安装
- 简单示例
- php
- python
- office
- excel
- 单元格选择数据区域
- 截取字符串
- vlookup 选择值
- iferror 错误默认值
- search 搜索
- weekday 取星期几
- left 取左边n个字符
- right 取右边n个字符
- sum 合计
- sumif 条件合计
- sumifs 多条件合计
- datedif 取时间间隔
- roundup 向上舍入数字
- rounddown 向下舍入数字
- large 取第n大值
- mod 求余函数
- word
- 邮件合并-保留两位小数
- MySql
- 安装
- 基础操作
- 备份还原数据库
- 创建、删除、修改数据表
- 表结构查询
- Docker方案
- 慢查询
- 全文搜索
- 备份与还原
- 备份数据表
- 支付
- 支付宝
- ssh证书生成
- 支付申请
- 成考
- 英语
- 音标-掐头法
- 音标-去尾法
- 音标-元音
- 对比法学习辅音发音
- 短元音-长元音
- 双元音
- 数学
- 1.实数系
- 2.乘方
- 3.代数式
- 4.单项式多项式
- 5.整式的概念与方程综合
- 6.合并同类项和移项
- 7.二次根式
- 8.方程
- Git
- WebHook
- 宝塔
- webhook工具实现
- commit 规范
- 安装
- 创建
- 发布、提交
- 查看
- 更新
- 分支
- 找回文件、目录
- Svn
- 设置默认编辑器
- ignore 忽略提交目录
- revert 恢复撤销
- C语言
- 环境安装
- 基础部分
- 单片机
- ESP8266
- ESP8266开发环境安装
- 基础知识
- sim800
- Windows
- Win7
- Win10
- wsl (Linux子系统)
- ArtTemplate
- 正则表达式
- 常用正则
- VsCode
- easy less
- 腾讯云
- 数据万象
- 任务接口
- 音视频转码任务
- 算法
- 宽高按比例缩放大小尺寸
- IOS
- 开发者账号
- uniapp-ios打包上架的坑
- 协议模板
- 隐私协议
- 酸酸乳
- bower
- SQL Server
- 多行数据连接字符串
- GROUP BY选取其他字段
- 支付宝
- IoT小程序
- 支付
- RSA秘钥生成