# nginx實用筆記
* 這是什么
* 為什么用選擇nginx
* 安裝及使用nginx
* 站點配置
* 域名綁定
* 配置php-fpm
* http代理模塊
* 正向代理
* 什么是代理
* http通訊原理
* 拋開nginx代理模塊的本質,ngx\_http\_proxy\_module原理
* 反向代理
* 負載均衡
* url重寫(未寫待續)
* url重定向(未寫待續)
* 實戰高負載高并發 (nginx+php性能優化) (未寫待續)
# 這是什么
> Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,并在一個BSD-like 協議下發行。由俄羅斯的程序設計師Igor Sysoev所開發,供俄國大型的入口網站及搜索引擎Rambler(俄文:Рамблер)使用。其特點是占有內存少,并發能力強,事實上nginx的并發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、新浪、網易、騰訊等。
這里都是吹牛逼的,更多吹牛逼資料請看:
百度百科,[http://baike.baidu.com/view/926025.htm](http://baike.baidu.com/view/926025.htm)
nginx官網,[http://nginx.org/en/](http://nginx.org/en/)
## 一句話總結
> 這是一個http服務器,同apache一樣,提供web服務。
> 可以做靜態資源服務器,存放html,js,css文件等等,
> 還可以配合FastCGI,完成對php文件的解析,實現nginx+php的動態服務。
> 還可以拿來做反向代理,做負載均衡。
# 為什么用選擇nginx
Nginx 是一個高性能的 Web 和反向代理服務器, 它具有有很多非常優越的特性:
作為 Web 服務器:相比 Apache,Nginx 使用更少的資源,支持更多的并發連接,體現更高的效率,能夠支持高達 50,000 個并發連接數的響應。
作為負載均衡服務器:Nginx 既可以在內部直接支持 Rails 和 PHP,也可以支持作為 HTTP代理服務器 對外進行服務。
## 一句話總結
> 因為愛所以愛,愛就選吧~
# 安裝及使用nginx
我是用Ubuntu的,在安裝軟件之前要更新源.
## 更新源
`apt-get update`
## 安裝nigx
`apt-get install nginx`
等到他安裝成功
輸入`nginx -v`,查看安裝的版本,
~~~
nginx version: nginx/1.4.6 (Ubuntu)
~~~
## 一句話總結
無驚無險的安裝完成,能夠愉快的玩耍了。如果沒有錯,直接訪問服務器的ip即可看到,
~~~
Welcome to nginx!
~~~
我這里用的是`Ubuntu 14.04.4LTS`, 所以安裝的版本是 nginx 1.4.6 。
這里科普下,`LTS`,指,長期支持維護版本。所以在生產環節下,裝軟件都盡量裝帶LTS標志的。而不是安裝最新版。
這樣子出現bug也只是需要更新一下,就可以堵上bug啦
# 站點配置
## 最基本的站點配置
站點的配置文件夾在這里,`/etc/nginx/sites-available/`
默認的站點文件
`vim /etc/nginx/sites-available/default`
我們可以通過,復制default,這個文件建立一個新的站點。可以理解吧~
### 最基本的html靜態資源服務器
~~~
server {
# 監聽的端口
listen 80;
# www目錄
root /www/default;
# 默認首頁(訪問時,沒有指定文件,會自動尋找這些文件,用作顯示)
index index.php index.html index.htm;
# 域名 http://localhost/
server_name localhost;
}
~~~
這就是一個最簡單的http靜態資源服務器了。
可以在`/www/default/index.html`,建立文件,然后訪問服務器的ip,如果是本地搭建的,訪問`127.0.0.1`
## 綁定域名(也可以說是配置虛擬主機)
server\_name,就是為了綁定域名的。
接到請求后的匹配規則
格式是這樣的
`server_name 域名 域名 域名 域名`
### 準確的匹配
~~~
server_name localhost localhost2 localhost3;
~~~
### 通配符匹配
~~~
server_name *.c2567.com;
或者
server_name c2567.*;
~~~
很顯然`*`就代表任意字符啦.
### 正則表達式匹配
~~~
server_name ~^(\d)\.c2567\.com$;
~~~
> `~`使用正則表達式
> `()`匹配內容存起來(所謂的子匹配)
> `\d`匹配數字
> `.+?`匹配一個或者多個字符,`?`是 非貪婪匹配
> `$`字符串末尾
就先科普這點吧。基本夠用了
## 配置php-fpm
~~~
server {
# 監聽的端口
listen 80;
# www目錄
root /www/default;
# 默認首頁(訪問時,沒有指定文件,會自動尋找這些文件,用作顯示)
index index.php index.html index.htm;
# 域名 http://localhost/
server_name localhost;
# 在默認的nginx配置中就有下面這段
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
# pathinfo的配置
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# 這里就是使用php-fpm sock的連接方式
fastcgi_pass unix:/var/run/php5-fpm.sock;
# 默認解析文件名
fastcgi_index index.php;
include fastcgi_params;
}
}
~~~
### 顯然現在依然不能運行 因為連php都沒有安裝
安裝吧,依然是簡簡單單一步到位的~
`apt-get install php5`
`apt-get install php5-fpm`
### 稍微普及下vim的使用方法
狂按esc,可以退回命令模式,命令模式可以輸入命令
#### 文件保存方面
:w 保存
:q 退出
:wq 保存并退出
#### 輸入方面
命令模式下輸入
a , 當前位置輸入
o ,新起一行輸入
#### 一句話總結
會這些已經足夠了完成編輯文件了。
### 建立一個index.php吧
那么安裝好了以后,建立文件在,`/www/default/index.php`
寫入內容
`vim /usr/share/nginx/html/index.php`
復制下面內容,在vim中,
1. 用方向鍵移動到要輸入的位置
2. 按a進入輸入模式
3. 粘貼內容
4. 按esc,進入vim的命令模式
5. 輸入`:wq`保存
~~~
<?php
phpinfo();
?>
~~~
那么,如果沒有意外,訪問服務器地址,`http://127.0.0.1/index.php`, 就會出現phpinfo的信息咯.
### 一句話總結
配置nginx和php,非常簡單,難就難在優化啊,后面我會給講解怎么做基本的優化,在有限的服務器資源下,做到高并發,高負載,依然屹立不倒。
# http代理模塊
## 參考資料
> ngx\_http\_proxy\_module[http://nginx.org/en/docs/http/ngx\_http\_proxy\_module.html](http://nginx.org/en/docs/http/ngx_http_proxy_module.html)
# 正向代理
## 什么是代理
這里就不說 正向代理跟反向代理有什么區別了,直入主題,代理是什么?代理相當于一個中介,中介是什么鬼,應該都知道吧。
### http的通訊原理
http協議屬于一問一答的的,所以就是 1對1的通訊。我問你答。
客戶端(問) 服務器(答)
具體點
客戶端->發送報文->服務器->收到報文->處理->服務器返回報文->客戶端收到
### 一句話總結
形象點說,
我問小明: 你吃飯了嗎。
小明答: 我吃了。
## 這跟正向代理有什么鬼關系。
既然http是一問一答形式,那么代理服務器是不是起了中轉作用了。
客戶端(問) -> 代理服務器(再問) -> 服務器(答)
具體一點
客戶端->發送報文到代理服務器->代理服務器收到報文
代理服務器(發送客戶端報文)->真正的服務器收到報文并處理->服務器返回處理好的報文給代理服務器
代理服務器收到(把真正服務器返回的報文)-> 發送給客戶端 -> 客戶端收到
### 一句話總結
形象點說,
`我`問`小紅`:小明吃飯了嗎。
`小紅`問`小明`: 吃飯了嗎。
`小明`答`小紅`說:吃了。
`小紅`答`我`說;小明吃了。
## 最簡單的正向代理
簡單的過程,
客戶端->代理服務器(nginx)->服務器->代理服務器(nginx)->客戶端
~~~
server {
# 設置dns服務器
resolver 114.114.114.114 114.114.114.115;
# 監聽端口
listen 2222;
location / {
# 傳入nginx的變量,實際上是拼接后就是一串url
proxy_pass $scheme://$host$request_uri;
}
}
~~~
### 設置 DNS 解析
`resolver dns地址 dns地址 dns地址`
如果改成8.8.8.8是不是就能上谷歌了啊,嘿嘿
#### 注意
這不支持https,因為https走的是443端口,是安全傳輸協議,服務器需要同客戶端建立連接,才可以通訊,所以無法中轉的,證書問題。
## 拋開nginx代理模塊的本質,ngx\_http\_proxy\_module原理
先看這個配置
~~~
server {
listen 99;
server_name localhost;
location / {
proxy_pass http://blog.c2567.com;
}
}
~~~
我快速的解釋下,
監聽了`99`端口
域名綁定為`localhost`,
訪問地址
[http://localhost:99/](http://localhost:99/)
[http://localhost:99/1.html](http://localhost:99/1.html)
[http://localhost:99/2.html](http://localhost:99/2.html)
出現的內容是不是,對應了,我博客的內容啊
[http://blog.c2567.com](http://blog.c2567.com/)
[http://blog.c2567.com/1.html](http://blog.c2567.com/1.html)
[http://blog.c2567.com/2.html](http://blog.c2567.com/2.html)
> ok,了解了這些,那么所謂的正向代理和反向代理,我也不知道這詞是哪里冒出來詞的,反正我讀了好多次都不明白是什么意思,但是這都不重要!因為他本質,即將赤裸裸的展現在我們面前。
再來看看 我們前面做的http代理服務器(正向代理)
~~~
location / {
proxy_pass $scheme://$host$request_uri;
}
~~~
$scheme 是不是相當于,客戶端傳過來的 http啊
$host 是不是相當于,客戶端傳過來的 域名啊
$request\_uri 是不是相當于,客戶端傳過來的 域名后面的參數啊
> 現在應該看穿nginx的代理了吧,他的本質是不是 客戶端訪問nginx,nginx訪問`proxy_pass`拼接的地址,得到結果,再傳回給客戶端。
> 既然如此,了解了他的本質,是不是改什么都不怕錯了。
> 還有什么鬼,正向代理,反向代理,http代理。各種代理,這詞是不是都不用害怕了。
# 反向代理
> Nginx 作為 web 服務器一個重要的功能就是反向代理。Nginx 反向代理的指令不需要新增額外的模塊,默認自帶 proxy\_pass 指令,只需要修改配置文件就可以實現反向代理。
## 最簡單的反向代理
~~~
server {
listen 99;
server_name localhost;
location / {
proxy_pass http://blog.c2567.com;
}
}
~~~
訪問,`http://localhost:99/`, 就是我的博客啦.這種過程就叫反向代理了.
### 舉個例子
訪問
`http://localhost:99/?page_id=2`
相當于訪問
`http://blog.c2567.com/?page_id=2`
其他的也雷同。
只是吧參數也一同訪問了。實質就是做了一次中轉。
# 負載均衡
簡單來說,就是高級一點的中轉代理。專業點叫`負載均衡`。呵呵。
## 最簡單的配置
### 顯示內容的服務器
~~~
server {
listen 83;
server_name localhost;
location / {
root html/3;
index index.html index.htm;
}
}
~~~
端口設置為81,82,83,
web目錄為,
~~~
html/1
html/2
html/3
~~~
建立文件 index.html
內容為
~~~
我是端口81
我是端口82
我是端口83
~~~
以此類推,做出3個服務器,修改端口號和目錄,頁面內容
### 均衡用的服務器
~~~
server {
listen 99;
server_name localhost;
location / {
proxy_pass http://ss;
}
}
upstream ss {
server 127.0.0.1:81;
server 127.0.0.1:82;
server 127.0.0.1:83;
}
~~~
正如你所看到的,這里定義了3個服務器的地址,對應的訪問內容為。
端口81內容為,`我是端口81`
端口81內容為,`我是端口82`
端口81內容為,`我是端口83`
~~~
server 127.0.0.1:81;
server 127.0.0.1:82;
server 127.0.0.1:83;
~~~
很顯然,現在訪問,`http://localhost:99/`,只要多刷新幾次,就能發現內容在變化了,這就是負載均衡。
## 負載均衡的模式
### 權重設置`weight=1`
~~~
upstream ss {
server 127.0.0.1:81 weight=3;
server 127.0.0.1:82 weight=2;
server 127.0.0.1:83 weight=1;
}
~~~
顯而易見,參數`weight`,就是權重啦,數值越高,訪問比例越大。
### 根據訪問的ip分配服務器,`ip_hash`
如果你想,某一個ip訪問某一個服務器,來保證SESSION不丟失。那么加入`ip_hash;`就可以達到目的了。
準確點的解釋,將訪問ip的hash結果分配,每個請求固定訪問一個后端服務器,
~~~
upstream ss {
ip_hash;
server 127.0.0.1:81;
server 127.0.0.1:82;
server 127.0.0.1:83;
}
~~~
### 根據壓力自動選擇壓力最小的,`fair`
簡單來說,誰訪問快就訪問誰~
~~~
upstream ss {
fair;
server 127.0.0.1:81;
server 127.0.0.1:82;
server 127.0.0.1:83;
}
~~~
反正我是沒成功報錯了,估計需要安裝這個模塊。
~~~
nginx: [emerg] unknown directive "fair"
~~~
## 更多參數
`down`表示單前的server暫時不參與負載.
`weight=1`默認為1.weight越大,負載的權重就越大。
`max_fails`允許請求失敗的次數默認為1.當超過最大次數時,返回proxy\_next\_upstream 模塊定義的錯誤.
`fail_timeout`如果達到`max_fails`次失敗后,暫停的時間。
## 例子
~~~
upstream backend {
server 127.0.0.1:81 max_fails=3 fail_timeout=30s;
server 127.0.0.1:81 max_fails=3 fail_timeout=30s;
server 127.0.0.1:81 max_fails=3 fail_timeout=30s;
}
~~~
# url重寫(未寫待續)
# url重定向(未寫待續)
# 未完待續
> 一次性寫了這么多東西真的好累啊~
- 后端
- composer
- composer配置國內鏡像
- composer安裝及設置2
- PHP
- 貝塔SG11加密
- 申請KEY
- 開始加密
- php 中連接tcp服務的三種方式
- php websocket 教程
- editor內容轉換數組
- 使用正則判斷中文維吾爾文
- PHP常用函數總結
- 常用助手函數
- 通過Imagick把pdf轉換圖片
- 維吾爾語基本區轉換擴展區
- php GD庫生成一個由文字和圖片生成新的圖片
- aes加密
- php數組函數 -- array_column,array_multisort 實現二維數組排序
- PHP操作Excel
- php更新內容
- 輔助查詢(*)
- 【時間】操作
- 時間函數例子
- Date/Time 函數(不包含別名函數)
- php網絡相關
- HTTP請求的返回值含義說明
- 使用php語言開發一個類似數據庫操作的文件表類
- pinyin
- 維吾爾語基本區轉換擴展區(2)
- php獲取當前環境的信息
- laravel
- laravel 隊列的使用
- laravel 自定義助手函數
- laravel seeder的使用
- laravel項目從git下載命令
- laravel 多個數據庫配置
- laravel 填充假數據
- laravel 動態路由
- laravel 自定義 validate 響應
- laravel 創建追加字段的模擬訪問器
- laravel 線上環境的數據庫更改或添加字段
- laravel 模型查詢按照whereIn排序
- laravel 使用 workerman 通過TCP 文件傳輸功能
- laravel api Header添加Accept頭
- Laraval IDE 自動補全插件 laravel-ide-helper
- laravel 網站后臺
- laravel 設置路由
- laravel-第三方composer包
- laravel 開發技巧
- laravel 昨天,今天時間
- 使用寶塔計劃任務啟動laravel調度器
- laravel結合workerman第二節
- Laravel - 上傳多個文件
- 查詢聊天好友列表
- 事件系統 event, listener
- laravel 安裝 laravel-modules
- 自定義求看守器-toekn
- laravel限流
- 使用 Laravel api Resource 類時自定義分頁信息
- Laravel php artisan命令大全
- 驗證器
- workerman 創建wss服務
- 架構師必須知道的26項PHP安全實踐
- python
- Python讀取文件代碼塊已經備好,用的時候光拿(建議收藏)
- Python常用庫大全
- api 簽名驗證
- git
- git命令
- 十分鐘學會git基礎
- Git代碼同時上傳到GitHub和Gitee(碼云)
- Git - 多人協同開發利器,團隊協作流程規范與注意事項
- 刪除遠程倉庫的文件
- github查詢方法
- 錯誤
- 解除項目git版本控制
- linux
- sentos安裝supervisor
- PHP怎么守護進程運行php腳本
- 600條最強Linux命令總結
- centos開啟防火墻、開放指定端口
- 前端
- vue
- vue2發布之前的config簡單配置
- vue2安裝scss命令
- vue2父子組件之間雙向數據綁定
- 國際化雙語--安裝VueI18n
- vue3-setup 組件傳參(defineProps、defineEmits、defineExpose
- Vue3 新寫法速覽:十分鐘內輕松get
- 關于vue的外連接
- watch講解
- computed
- webpack 打包后生成很多小文件怎么優化?
- vue2 vue.config.js常見配置和打包部署測試
- 小程序
- 小程序長期訂閱消息
- 小程序自定義TabBar后如何實現keep-alive
- 收藏的html和css和js
- CSS 省略號(單行省略號、多行省略號)
- UyghurInput_a.js
- font.css
- 漂亮按鈕樣式
- clock.html
- css
- scroll css樣式
- CSS流動布局-頁面自適應
- css grid布局
- 禁止wap頁面調整字體大小
- CSS @media 和 min-width/max-width
- 網站變灰是怎么實現的
- 瀑布流實現方式
- javascript
- SortableJS拖動排序
- wondow scroll滾動到上邊
- 原生js插入HTML元素
- Konva.js —— 像操作DOM一樣操作canvas
- 通過canvas合并倆個圖片
- js scroll更多加載
- js 實現復制功能
- js判斷安卓和蘋果或者微信
- 瀏覽器打開控制臺禁止
- 原生js一些dom操作
- js http客戶端集合
- fetch
- axios
- canvas 點鐘
- layer dialog
- jquery 和 laravel ajax全局配置
- layui 獲取select的自定義參數
- konva.js中文開發文檔
- js 大文件分片上傳
- js監聽網絡狀態實現斷網重連后自動刷新頁面
- js生成video縮略圖
- JS獲取當前系統電量情況
- uniapp
- uni-app swiper數量過多時卡頓優化方案
- uniapp 帖子集合
- 微信wap
- wap分享朋友和朋友圈
- wap 手機頁面微信支付
- JsSdk微信公眾號支付
- 通用各種小知識
- 正則表達式
- JS正則匹配過濾字符串中的html標簽及html標簽內的內容
- 判斷維吾爾文輸入
- 正則表達式符號
- 正則表達式練習
- 百度網盤不限速下載助手
- 解決VSCode下載慢或下載失敗的問題
- 性能測試 使用Apache的ab測試工具
- nginx從入門到精通
- nginx
- Nginx 是怎么禁止訪問php的 ?
- 寶塔面板
- supervisor
- 卸載寶塔
- redis
- redis實用筆記
- redis入門到精通
- phpredis
- redis數據庫基礎
- PHP對Redis的基本操作
- ffmpeg
- 合并多個音視
- 獲取音視時長
- FFmpeg視頻處理入門教程(新手必看)
- 外連接
- 安裝
- PHP基于ffmpeg實現轉換視頻,截圖及生成縮略圖的方法
- Linux安裝ffmpeg
- docker
- 服務實現
- docker基本命令
- rewrite筆記
- 別人筆記鏈接
- 計算機常用知識
- 二進制1-10
- 斐波那契數列
- mysql
- 高性能高可用的MySQL,得從各種規范開始
- 讀寫分離配置
- 重要外連接,前端/ 后端/數據庫等等
- 關于程序必須收藏的文章鏈接集合
- markdown
- 一篇文章講清楚markdown