一.反向代理
我們都知道,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{}塊定義了虛擬主機
- listener監聽端口
- server_name監聽域名
- location{}是用來為匹配的 URI 進行配置,URI 即語法中的“/uri/”,location / { }匹配任何查詢,因為所有請求都以 / 開頭.
- root指定對應uri的資源查找路徑,這里html為相對路徑,完整路徑為/opt/ opt/nginx-1.7.7/html/
- index指定首頁index文件的名稱,可以配置多個,以空格分開。如有多個,按配置順序查找.
從配置可以看出,nginx監聽了80端口、域名為localhost、跟路徑為html文件夾(我的安裝路徑為/opt/nginx-1.7.7,所以/opt/nginx-1.7.7/html)、默認index文件為index.html, index.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.conf中default-type指定的默認值。例如,默認配置中的指定的default-type為application/octet-stream.
include mime.types;
default_type application/octet-stream;
下面截一段mime.types定義的文件擴展名與文件類型映射關系,完整的請自行查看:
fastcgi_params
nginx配置Fastcgi解析時會調用fastcgi_params配置文件來傳遞服務器變量,這樣CGI中可以獲取到這些變量的值。默認傳遞以下變量:
這些變量的作用從其命名可以看出.
2.4.fastcgi.conf
對比下fastcgi.conf與fastcgi_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.conf是nginx 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-utf、koi-win、win-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 保存並退出,下次重啟會生效。