## 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秘鑰生成