Nginx動靜分離實現:
Nginx是一種輕量級,高性能,多進程的Web服務器,非常適合作為靜態資源的服務器使用,而動態的訪問操作可以使用穩定的Apache、Tomcat及IIS等來實現,這里就以Nginx作為代理服務器的同時,也使用其作為靜態資源的服務器,而動態的訪問服務器就以Apache為例說明。
· 原理
· 實現
· 驗證
一、原理
原理:
說明:
1、代理服務器和靜態服務器即為一台服務器上,這里只是為了明顯區分動靜分離所處服務器的不同;
2、靜態服務器中,存放的資源主要是源代碼文件、圖片、屬性、樣式以及其它所有非動態的資源文件;
3、調度規則,即為代理服務器,這里是Nginx的服務器調度規則;
4、動態服務器,其種類比較繁多,可以是Apache、Tomcat、IIS以及其它Web服務器,它們一般分別隸屬於一台服務器;
二、實現
1、實現說明
如上圖所示,當客戶端訪問代理服務器時:
首先,加載和顯示存放在靜態服務器中的靜態資源,這里以html為例;
其次,如果上一步沒有匹配對應的資源,我們就認為是動態訪問請求,那么就直接訪問參與負載均衡的服務器列表中的某一台服務器的動態操作;
最后,Nginx作為Web服務器加載靜態資源(html、css、js、image),而靜態資源如果需要動態獲取數據,並填充到頁面顯示,會自動去往負載服務器獲取並返回,在實現了動態分離的同時,也參與了服務器的負載均衡。
2、准備工作
准備兩台計算機設備,分別為:
靜態服務器:169.254.195.161
動態服務器:169.254.28.29
3、安裝配置
首先,在靜態服務器中安裝Nginx服務器,在動態服務器中安裝Apache服務器,具體安裝過程中這里省略;
其次,分別配置Nginx和Apache,配置如下:
nginx.conf:
http {
#load balancing servers
upstream webservers {
ip_hash;
server 169.254.28.29max_fails=2 fail_timeout=2;
}
server {
listen 80;
server_name localhost;
access_log/usr/local/nginx/logs/access.log;
error_log/usr/local/nginx/logs/error.log;
#limitbuffer size and overflows
client_body_buffer_size16k;
client_header_buffer_size1k;
client_max_body_size1m;
#default char set
charset utf-8;
#默認靜態資源
location / {
root /project/cwteam;
index index.html index.htm
allow all;
}
#動態資源加載
location ~\.(PHP|jsp)?$ {
proxy_pass http://webservers;
}
}
}
httpd.conf:
這里只羅列Apache根目錄的配置路徑,如下:
DocumentRoot “D:/project/cwteam”
<Directory “D:/project/cwteam”>
Options IndexesFollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
最后,啟動Nginx和Apache服務,並驗證是否成功啟動。
三、驗證
首先,在靜態服務器中的Web根目錄下,放置一個static.html文件,內容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="../Public/htmls/js/jQuery-1.8.3.min.js"></script>
</head>
<body style="">
<div id="ajaxDync"></div>
</body>
<script type="text/JavaScript">
$(document).ready(function() {
$.ajax({
url:'./dynamic.php?action=ok',
type:'get',
cache : false,
success:function(data){
$("#ajaxDync").html(data);
}
});
});
</script>
</html>
其次,在動態服務器中的Web服務器目錄下放在一個動態腳本dynamic.php,內容如下:
<?php
if($_GET['action']=='ok'){
echo 'Hello World!'.'---IP:169.254.28.29';
}
?>
NOTE:
1、為了區分動靜服務器內的服務器腳本,我們在靜態服務器中的dynamic.php內容:
<?php
if($_GET['action']=='ok'){
echo 'Hello World!'.'---IP:169.254.195.161';
}
?>
而在動態服務器中的dynamic.php內容如下:
<?php
if($_GET['action']=='ok'){
echo 'Hello World!'.'---IP:169.254.28.29';
}
?>
2、需要保證動靜服務器擁有同樣的代碼項目,一般使用rsync同步軟件同步不同服務器中的項目資源文件,關於rsync會在后續總結介紹使用。
最后,打開瀏覽器輸入192.168.1.100,結果如下: