Nginx反向代理部署指南


 一.反向代理

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

我們來看下面兩個場景:

 1.服務器的80端口被占用了,我們想實現服務器的其他端口(比如port:2368)web服務.

 2.我們想在一台服務器上實現多個站點的web服務.

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

                                                                                                                     

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

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

    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  保存並退出,下次重啟會生效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM