## 為什么要使用反向代理
具體請參考這篇博文: [【Linux常識篇(1)】所謂的正向代理與反向代理][1]
## 在虛擬機上配置反向代理的步驟
首先假設你已經假設好了LNMP架構了,這時我們還要安裝Apache和php,為什么還要再裝一次PHP?因為Apache默認是把PHP作為本身的一個模塊(mod_php)來運行的,與Nginx的運行方式不同.
### step1: 安裝與配置Apache與php
我們的目的是在localhost:88上配置web1和web2的站點
#### 安裝
```
yum -y install httpd httpd-devel # Ubuntu里面叫做Apache2
yum -y install php php-mysql php-common php-gd php-mbstring php-mcrypt php-devel php-xml
```
#### 配置
Apache配置文件/etc/httpd/conf/httpd.conf修改如下信息(不同的就修改,沒有的就添加)
Listen 88
ServerName localhost:88
NameVirtualHost *:88
<VirtualHost *:88>
DocumentRoot /home/wwwroot/web2/
ServerName web2.com
ErrorLog logs/web2-error_log
CustomLog logs/web2-access_log common
</VirtualHost>
<VirtualHost *:88>
DocumentRoot /home/wwwroot/web1/
ServerName web1.com
ErrorLog logs/web1-error_log
CustomLog logs/web1-access_log common
</VirtualHost>
然后配置hosts后通過以下能正常訪問到默認的index.php就代表完成第一步
web1.com:88
web2.com:88
### step2: 在Nginx.conf中配置反向代理
#### 通過proxy_pass指向代理服務器Apache
語法:proxy_pass URL
默認值:no
作用域:location, location中的if字段
這個指令設置被代理服務器的地址和被映射的URI,地址可以使用主機名或IP加端口號的形式,例如:proxy_pass http://localhost:8000/uri/;
```
# 在Nginx的web1的server段加上
location / {
proxy_pass http://127.0.0.1:88;
}
```
重啟Nginx服務,然后再訪問web1.com(**客戶端192.168.42.196 -> 服務端192.168.42.188**),這個時候訪問的是Nginx監聽的80端口,進的是Nginx服務,然后Nginx的location命中,再然后由Nginx訪問88的httpd(Apache)服務,然后通過Apache來解析執行該文件,這時產生兩條日志分別是Nginx服務和Apache服務的兩條訪問日志
```
# Nginx
192.168.42.196 - - [27/Sep/2015:16:06:10 +0800] "GET / HTTP/1.1" 200 20 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0" -
#Apache
192.168.42.188 - - [27/Sep/2015:16:06:10 +0800] "GET / HTTP/1.0" 200 20
```
我們注意到訪問Apache的ip就是服務器的ip,這跟我們想要的客戶端ip不符,這時我們就要用到另外一個指令proxy_set_header
#### 通過proxy_set_header向代理服務器Apache發送真實客戶端IP
這個指令允許將發送到被代理服務器的請求頭重新定義或者增加一些字段。這個值可以是一個文本,變量或者它們的組合。proxy_set_header在指定的字段中沒有定義時會從它的上級字段繼承。
語法:proxy_set_header header value
默認值: Host and Connection
使用字段:http, server, location
```
location / {
proxy_pass http://127.0.0.1:88;
proxy_set_header X-Real-IP $remote_addr; #加上這一行,把$remote_addr賦給變量X-Real-IP,然后該變量可以被后端服務器(被反向代理的服務器)的日志格式中接收到(不管是Nginx和Apache都可以)
}
```
**注意:** 此時Nginx已經通過proxy_pass向代理服務器Apache發送真實客戶端IP了,**但是Apache還沒接受Nginx發送過來的IP**
所以我們還要去更改Apache的配置文件
```
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
# 將%h修改為%{X-Real-IP}i,這里要注意在虛擬主機中的日志格式是不是combined,反正就是修改對應的日志格式既可;
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
```
此時我們就可以把PHP動態文件返回給Apache處理,然后Nginx本身就只處理靜態文件,這時我們就可以通過Nginx使用到Apache強大的偽靜態功能了
也可以通過配置緩存功能加速Web請求,緩存真實Web服務器上的某些靜態資源,減輕真實Web服務器的負載壓力
```
location ~ \.(jpg|jpeg|png|gif)$ {
proxy_pass http://192.168.1.204:8080;
expires 1d;
}
```
### step3: 推薦配置
事實上Nginx需要反向代理過去的,不僅僅有ip,還包含著客戶端http請求頭必要信息,比如cookie,host,referer等信息,所以推薦如下配置:
```
location /
{
try_files $uri @apache; #try_files 將嘗試你列出的文件并設置內部文件指向
}
location @apache
{
internal; # internal指令指定某個location只能被“內部的”請求調用,外部的調用請求會返回”Not found”
proxy_pass http://127.0.0.1:88;
proxy_connect_timeout 300s;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 32k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_redirect off;
proxy_hide_header Vary;
proxy_set_header Accept-Encoding '';
proxy_set_header Host $host;
proxy_set_header Referer $http_referer;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
```
## LNMPA
通過Nginx強大的反向代理功能,把動態文件給Apache處理,這就形成了LNMPA架構
### LNMP或LAMP的劣勢
Nginx是一個小巧而高效的Linux下的Web服務器軟件,與Apache相比,消耗資源更少,支持的并發連接,更高的效率,反向代理功能效率高、靜態文件處理快等,但動態頁面處理能力不如Apache等老牌軟件成熟。單獨使用Nginx處理大量動態頁面時容易產生頻繁的502錯誤。
Apache是一款老牌的Web服務器軟件,在高并發時對隊列的處理比FastCGI更成熟,Apache的mod_php效率比php-cgi更高且更穩定、對偽靜態支持好,不需要轉換、多用戶多站點權限等方面有著更好的效果,而單獨使用Apache處理靜態頁面時,對內存的占用遠遠超過Nginx。
### LNMPA的優勢
LNMPA使用Nginx作為前端服務器,能夠更快、更及時地使用更少的系統資源處理靜態頁面、js、圖片等文件,當客戶端請求訪問動態頁面時,由Nginx反向代理給作為后端服務器的Apache處理,Apache處理完再交予Nginx返回給客戶端。
采用LNMPA能夠更好的解決LNMP架構中由于PHP-FPM方面產生的502錯誤,同時能夠以很簡單的方式提供更安全的多用戶多站點環境。
[1]: https://www.zybuluo.com/a5635268/note/172321
- Apache
- 【Apache運維基礎(1)】Apache的安裝與使用
- 【Apache運維基礎(2)】主配置文件說明
- 【Apache運維基礎(3)】虛擬主機配置說明
- 【Apache運維基礎(4)】Apache的Rewrite攻略(1)
- 【Apache運維基礎(5)】Apache的Rewrite攻略(2).htaccess文件
- 【Apache運維基礎(6)】Apache的日志管理與分析
- 工具篇
- supervisor進程管理器
- Haproxy安裝與配置
- Nginx
- 【nginx網站性能優化篇(1)】gzip壓縮與expire瀏覽器緩存
- 【nginx網站性能優化篇(2)】反向代理實現Apache與Nginx的動靜分離(LNMPA)
- 【nginx網站性能優化篇(3)】反向代理實現負載均衡
- 【nginx網站性能優化篇(4)】理解nginx的高并發原理及其配置調優
- 【nginx運維基礎(1)】Nginx的編譯安裝與使用
- 【nginx運維基礎(2)】Nginx的配置文件說明及虛擬主機配置示例
- 【nginx運維基礎(3)】Nginx的編譯PHP
- 【nginx運維基礎(4)】Nginx的日志管理(日志格式與定時分割日志)
- 【nginx運維基礎(5)】Nginx的location攻略
- 【nginx運維基礎(6)】Nginx的Rewrite語法詳解
- 【nginx運維基礎(7)】配置SSL支持https訪問
- 【nginx運維基礎(8)】配置支持http2協議
- 【nginx運維基礎(9)】了解PHP-FPM 與 Nginx 的通信機制
- 其它
- Apache與Nginx下php隱藏http頭部版本信息的實現方法
- CURL與PHP-CLI的應用【CLI篇】
- CURL與PHP-CLI的應用【Curl篇】
- Linux之SAMBA共享服務
- 【Linux常識篇(1)】所謂的正向代理與反向代理
- 【Linux常識篇(2)】理解inode
- 【Linux常識篇(3)】文件及文件夾的ctime atime mtime的含義詳解
- centOS使用手記
- 服務器日志分析
- 高頻命令
- df
- mv
- gzip
- cp
- tar
- touch
- cat
- uniq
- nl
- more
- rmdir
- less
- mkdir
- head
- rm
- tail
- 五大查詢命令
- vi&vim
- ls與目錄結構
- grep
- awk
- sed
- 其他高頻命令