Nginx反向代理部署指南

 一.反向代理

  咱們都知道,80端口是web服務的默認端口,其餘主機訪問web服務器也是默認和80端口進行web交互,而一臺服務器也只有一個80端口,這是約定俗成的標準.html

咱們來看下面兩個場景:nginx

 1.服務器的80端口被佔用了,咱們想實現服務器的其餘端口(好比port:2368)web服務.web

 2.咱們想在一臺服務器上實現多個站點的web服務.正則表達式

要解決這個問題,須要用到反向代理,下面的小對話可能更容易理解‘反向代理’這個概念shell

                                                                                                                     

主機H:我給你發了一個http get請求,IP分組部分信息爲:ubuntu

    a.我訪問的域名(解析前的域名,如:www.domain.com).windows

    b.我要訪問的IP(www.domain.com域名解析後的公網IP).後端

服務器S的web服務程序收到IP分組後,先把這個IP分組丟給nginx(或Apache反向代理服務)看,nginx拿到IP分組後根據a.要訪問的域名來檢查配置文件,看是否須要轉其餘端口.例如:配置文件裏面有這樣的描述:數組

    若是這個分組的a是www.domain1.com,那麼轉到2368端口;瀏覽器

    若是這個分組的a是www.domain2.com,那麼轉到1243端口;

    若是這個分組的a是www.domain3.com,那麼轉到2104端口;

    不然就用80端口.

web服務程序照作,把相應端口的數據傳給主機H.

                                                                                                                     

通俗的說,就是:服務器根據主機來訪域名區分須要轉哪一個端口.

利用上面的配置,咱們就能夠實如今一臺服務器上創建4個web服務站點.

二.如何實現

實現反向代理通常有兩種方法:

1.Apache反向代理服務

2.nginx反向代理服務

其中nginx在負載均衡這方面比Apache更專業,小巧專注,非常優雅.

nginx反向代理的具體操做以下:

安裝nginx

以RedHat爲例

1.下載介質

   nginx部署以前,首先根據項目的須要選擇須要安裝的組件,實際環境通常會考慮須要支持gzip壓縮和rewrite模塊,因此安裝的第一步是下載Ngix及Ngix的相關組件.

1) nginx自己

   下載地址:http://nginx.org/en/download.html

   建議下載最新版本介質,目前最新的是:1.9.9

2) gzip壓縮依賴庫:zlib

   下載地址:http://www.zlib.net

   下載版本:Version 1.2.5

3)Rewrite模塊的正則表達式依賴庫:pcre

   pcre庫簡稱:Perl兼容正則表達式

   下載地址:http://www.pcre.org

   下載版本:pcre-8.38

2.開始安裝

1) .安裝 pcre

tar -zxvf pcre-8.02.tar.gz
./configure
make
make install

默認安裝到/usr/local/lib下便可,安裝完成後能夠#ls -l /usr/local/lib/libpcre.so

2).安裝nginx

tar zxvf nginx-1.0.11.tar.gz
cd nginx-1.0.11
./configure --prefix=/usr/local/nginx  --with-poll_module   --with-http_stub_status_module
make && make install

3) .配置nginx

安裝完成以後,配置目錄conf下有如下配置文件,過濾掉了xx.default配置:

tyler@ubuntu:/opt/nginx-1.7.7/conf$ tree |grep -v default
.
├── fastcgi.conf
├── fastcgi_params
├── koi-utf
├── koi-win
├── mime.types
├── nginx.conf
├── scgi_params
├── uwsgi_params
└── win-utf

除了nginx.conf,其他配置文件,通常只須要使用默認提供便可.

nginx.conf

nginx.conf是主配置文件,默認配置去掉註釋以後的內容以下圖所示:

  • worker_process表示工做進程的數量,通常設置爲cpu的核數
  • worker_connections表示每一個工做進程的最大鏈接數
  • server{}塊定義了虛擬主機
  1. listener監聽端口
  2. server_name監聽域名
  3. location{}是用來爲匹配的 URI 進行配置,URI 即語法中的「/uri/」,location  / { }匹配任何查詢,由於全部請求都以 / 開頭.
  4. root指定對應uri的資源查找路徑,這裏html爲相對路徑,完整路徑爲/opt/ opt/nginx-1.7.7/html/
  5. index指定首頁index文件的名稱,能夠配置多個,以空格分開。若有多個,按配置順序查找.

從配置能夠看出,nginx監聽了80端口、域名爲localhost、跟路徑爲html文件夾(個人安裝路徑爲/opt/nginx-1.7.7,因此/opt/nginx-1.7.7/html)、默認index文件爲index.htmlindex.htm、服務器錯誤重定向到50x.html頁面。

能夠看到/opt/nginx-1.7.7/html/有如下文件:

tyler@ubuntu:/opt/nginx-1.7.7/html$ ls
50x.html  index.html

這也是上面在瀏覽器中輸入http://localhost,可以顯示歡迎頁面的緣由。實際上訪問的是/opt/nginx-1.7.7/html/index.html文件.

mime.types

文件擴展名與文件類型映射表,nginx根據映射關係,設置http請求響應頭的Content-Type值.

當在映射表找不到時,使用nginx.confdefault-type指定的默認值。例如,默認配置中的指定的default-typeapplication/octet-stream.

include       mime.types;
default_type  application/octet-stream;

下面截一段mime.types定義的文件擴展名與文件類型映射關係,完整的請自行查看:

fastcgi_params

nginx配置Fastcgi解析時會調用fastcgi_params配置文件來傳遞服務器變量,這樣CGI中能夠獲取到這些變量的值。默認傳遞如下變量:

這些變量的做用從其命名能夠看出.

2.4.fastcgi.conf

對比下fastcgi.conffastcgi_params文件,能夠看出只有如下差別:

tyler@ubuntu:/opt/nginx-1.7.7/conf$ diff fastcgi.conf fastcgi_params 2d1
< fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

fastcgi.conf只比fastcgi_params多了一行「fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

本來只有fastcgi_params文件,fastcgi.confnginx 0.8.30 (released: 15th of December 2009)才引入的.

本來nginx只有fastcgi_params,後來發現不少人在定義SCRIPT_FILENAME時使用了硬編碼的方式。例如,fastcgi_param SCRIPT_FILENAME

/var/www/foo$fastcgi_script_name。因而爲了規範用法便引入了fastcgi.conf

不過這樣的話就產生一個疑問:爲何必定要引入一個新的配置文件,而不是修改舊的配置文件?

這是由於fastcgi_param指令是數組型的,和普通指令相同的是:內層替換外層;和普通指令不一樣的是:當在同級屢次使用的時候,是新增而不是替換.

換句話說,若是在同級定義兩次SCRIPT_FILENAME,那麼它們都會被髮送到後端,這可能會致使一些潛在的問題,爲了不此類狀況,便引入了一個新的配置文件。

所以再也不建議你們使用如下方式(搜了一下,網上大量的文章,而且nginx.conf的默認配置也是使用這種方式):

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;

而使用最新的方式:

include fastcgi.conf;

uwsgi_params

fastcgi_params同樣,傳遞哪些服務器變量,只有前綴不同,以uwsgi_param開始而非fastcgi_param.

scgi_params

fastcgi_params同樣,傳遞哪些服務器變量,只有前綴不同,以uwsgi_param開始而非fastcgi_param.

koi-utfkoi-winwin-utf

這三個文件都是與編碼轉換映射文件,用於在輸出內容到客戶端時,將一種編碼轉換到另外一種編碼。

koi-win: charset_map  koi8-r < -- > windows-1251
koi-utf: charset_map  koi8-r < -- > utf-8
win-utf: charset_map  windows-1251 < -- > utf-8

4).管理nginx服務

啓動:

/usr/local/nginx/sbin/nginx

中止

/usr/local/nginx/sbin/nginx -s stop

重啓

/usr/local/nginx/sbin/nginx -s reload

查看狀態

netstat -autlp| grep nginx

三.nginx開機自啓

實現:編寫shell腳本,並把shell腳本啓動命令加到系統自啓名單.

vi /etc/init.d/nginx  (輸入下面的代碼)

#!/bin/bash
# nginx Startup script for the nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: nginx is a high-performance web and proxy server.
#              It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/sbin/nginx
nginx_config=/usr/local/nginx/conf/nginx.conf
nginx_pid=/var/run/nginx.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {
if [ -e $nginx_pid ];then
 echo "nginx already running...."
 exit 1
fi
 echo -n $"Starting $prog: "
 daemon $nginxd -c ${nginx_config}
 RETVAL=$?
 echo
 [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
 return $RETVAL
}
# Stop nginx daemons functions.
stop() {
      echo -n $"Stopping $prog: "
      killproc $nginxd
      RETVAL=$?
      echo
      [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid
}
# reload nginx service functions.
reload() {
  echo -n $"Reloading $prog: "
  #kill -HUP `cat ${nginx_pid}`
  killproc $nginxd -HUP
  RETVAL=$?
  echo
}
# See how we were called.
case "$1" in
start)
      start
      ;;
stop)
      stop
      ;;
reload)
      reload
      ;;
restart)
      stop
      start
      ;;
status)
      status $prog
      RETVAL=$?
      ;;
*)
      echo $"Usage: $prog {start|stop|restart|reload|status|help}"
      exit 1
esac
exit $RETVAL

 :wq  保存並退出

設置文件的權限:

chmod a+x /etc/init.d/nginx

這樣在控制檯就很容易的操做nginx了:查看nginx當前狀態、啓動nginx、中止nginx、重啓nginx…

 一樣的修改了nginx的配置文件nginx.conf,也可使用上面的命令從新加載新的配置文件並運行,能夠將此命令加入到rc.local文件中,這樣開機的時候nginx就默認啓動了

vi /etc/rc.local

加入一行  /etc/init.d/nginx start  保存並退出,下次重啓會生效。

相關文章
相關標籤/搜索