在阿里云、微軟Windows Azure、亞馬遜AWS 上使用Nginx配置http正向代理服務(wù)器
作為一個(gè)完全的Linux和Nginx雙料白癡,我覺(jué)得有必要把這幾天的折騰整理一下,以備以后查看。
首先我接到的是5臺(tái)安裝好Linux的云主機(jī),兩臺(tái)阿里云,兩臺(tái)Azure和一臺(tái)AWS。(包括云主機(jī)IP,主機(jī)名,用戶名和密碼)
我要做的事情:
第一步:登錄云主機(jī)。
網(wǎng)上查很多人推薦使用Putty,這里我們老大推薦我是使用X Manager Enterprise 4。
安裝好以后打開(kāi)
運(yùn)行xshell,建立一個(gè)新連接。點(diǎn)擊菜單欄File中的“New”,打開(kāi)新建會(huì)話窗口,在窗口右側(cè)“Name”中填入”主機(jī)名“,“Host”中填入“云主機(jī)IP”,其他保持默認(rèn),點(diǎn)擊“OK”。
點(diǎn)擊OK后會(huì)彈出如下窗體,并多出一個(gè)選項(xiàng)(紅框中)
雙擊上圖紅框中的新增項(xiàng)彈出
輸入用戶名,為了方便下次直接進(jìn)入,選上記住用戶名復(fù)選框。點(diǎn)擊OK。窗體消失。選擇File—Open彈出以下窗體窗體消失。選擇File—Open)
雙擊剛才的新增項(xiàng),彈出以下窗體
填入密碼,選擇記住密碼,點(diǎn)擊OK。登錄成功。
說(shuō)明:登錄云主機(jī)有兩種方式,一個(gè)是上面說(shuō)的用戶名密碼方式,另一種是公鑰,私鑰的方式。為了方便運(yùn)維的同學(xué)幫我將這5太云主機(jī)的遠(yuǎn)程登錄方式都改成了用戶名密碼方式。如果選擇公鑰私鑰方式,是沒(méi)有辦法輸入密碼的。
第二步:查看當(dāng)前Linux版本信息。
因?yàn)楸拘“讖木W(wǎng)上查得配置nginx大多是基于某一版本的Linux的,所以我就想了解下本與主機(jī)的Linux版本。
使用命令:lsb——release -a
我這里安裝的是CenOS 6.5。據(jù)說(shuō)CenOS也是服務(wù)器端使用的最多的Linux版本。
#p#
第三步:安裝Nginx。
Nginx的安裝方式有編譯安裝,yum安裝等,這里我們老大要求使用yum安裝的方式。
首先需要檢查一下,云主機(jī)里有沒(méi)有Nginx安裝文件。
命令:yum list | grep nginx
如上圖所示,我的cenos 里是有nginx安裝包的(因?yàn)槲乙呀?jīng)安裝完了,不可能沒(méi)有啊,哈哈)
說(shuō)明:經(jīng)查找 ,我的的兩臺(tái)阿里云里有nginx安裝包,Azure和AWS中沒(méi)有,不知道阿里云中的是不是運(yùn)維同學(xué)幫忙下好的。而且有的安裝教程上第一步是yum update,yum uodate的作用是升級(jí)現(xiàn)有的軟件和內(nèi)核??梢圆簧?jí),AWS上的Linux版本跟其他4臺(tái)不一樣是Red Hat6.6,我不確定是不是運(yùn)行了yum update造成的。
如果主機(jī)中有nginx安裝文件,運(yùn)行命令:
- yum install nginx
如果主機(jī)中沒(méi)有nginx安裝文件,運(yùn)行命令:
- yum install http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
安裝完成后運(yùn)行:service nginx start 會(huì)顯示[OK]的字樣。
最后在瀏覽器輸出ip 測(cè)試一下,如果出現(xiàn)nginx 的歡迎頁(yè)面,代表已經(jīng)成功了。
如果不成功,運(yùn)行sudo nginx -t 查看配置文件是否有錯(cuò)。
說(shuō)明:這一命令需要root權(quán)限才能正確執(zhí)行,所以前面加sudo 點(diǎn)擊回車后會(huì)提示輸入密碼,重新輸入密碼即可。
如果配置文件有問(wèn)題,怎根據(jù)提示修改配置文件,或者查看錯(cuò)誤日志。不過(guò)一般情況下新安裝的nginx配置文件沒(méi)有修改過(guò),不會(huì)有問(wèn)題,只有修改過(guò)的才可能出錯(cuò)。
(CenOS6.5下安裝的nginx默認(rèn)主配置文件的路徑是: sudo vi /etc/nginx/nginx.conf sudo是以root權(quán)限運(yùn)行 vi是編輯器,后面我會(huì)介紹用到的vi中的幾個(gè)命令。)
既然配置文件基本不會(huì)出錯(cuò),如果看不到歡迎界面的話,有可能是防火墻的問(wèn)題。
關(guān)閉防火墻 命令:sudo service iptables stop
至此,Nginx已經(jīng)全部配置安裝完成。
第四步:配置Nginx http正向代理
首先找到主配置文件,上文中提到過(guò) sudo vi /etc/nginx/nginx.conf
這是用vi編輯器打開(kāi),點(diǎn)“i”進(jìn)入編輯狀態(tài),否則看不全,一直下拉會(huì)找到紅框中的文件路徑,這個(gè)路徑下的文件就是我們要配置的文件。
復(fù)制路徑/etc/nginx/conf.d/ 退出編輯器。下面我說(shuō)一下這里用到的幾個(gè)vi編輯器中命令。
- i --進(jìn)入編輯狀態(tài)
- Esc --退出編輯狀態(tài)
- q --在沒(méi)有修改的情況下退出vi
- q! --修改了,但是不想保存,強(qiáng)行退出
- wq --修改了,保存并退出
現(xiàn)在我們要找到的是修改的文件 命令:
- cd/etc/nginx/conf.d/ --進(jìn)入conf.d文件夾
- ls -lsh --ls是查看文件夾下的所有文件, -lsh是顯示文件屬性 并按照時(shí)間排序。這里可以只用 ls
- 我們要修改的是default.conf 進(jìn)入這個(gè)文件的編輯狀態(tài):sudo vi default.conf
- 點(diǎn)i進(jìn)入編輯狀態(tài)(一下內(nèi)容部分引自網(wǎng)絡(luò))
Nginx 正向代理配置文件:
- server {
- resolver 8.8.8.8;
- resolver_timeout 5s;
- listen 8090;
- location / {
- proxy_pass $scheme://$host$request_uri;
- proxy_set_header Host $http_host;
- proxy_buffers 256 4k;
- proxy_max_temp_file_size 0;
- proxy_connect_timeout 30;
- proxy_cache_valid 200 302 10m;
- proxy_cache_valid 301 1h;
- proxy_cache_valid any 1m;
- }
- }
Nginx 正向代理配置說(shuō)明(以上沒(méi)有顯示內(nèi)容,注釋掉即可):
1.配置 DNS 解析 IP 地址,比如 Google Public DNS,以及超時(shí)時(shí)間(5秒)。
resolver 這里你要改成你們DNS服務(wù)器的IP (查看dns的命令:cat /etc/resolv.conf);
resolver_timeout 5s;
說(shuō)明:如果自己dns服務(wù)器對(duì)應(yīng)的ip不止一個(gè),網(wǎng)上的解決方案是兩個(gè)ip并排,用空格分開(kāi),如resolver 8.8.8.8 9.9.9.9; 但是我試過(guò)是不行的,現(xiàn)在我只綁定了一個(gè)IP,如果誰(shuí)有解決辦法,希望能得到您的指點(diǎn)。
對(duì)于listen 8090; 這個(gè)是端口是自己制定的,阿里云我用的是80 ,微軟云和aws我用的是8090.
值得一提的是阿里云這些端口是默認(rèn)開(kāi)放的,而微軟與和AWS默認(rèn)只開(kāi)放了22端口,如果用到其他的端口,需要請(qǐng)運(yùn)維幫忙開(kāi)通。
2.配置正向代理參數(shù),均是由 Nginx 變量組成。其中 proxy_set_header 部分的配置,是為了解決如果 URL 中帶 "."(點(diǎn))后 Nginx 503 錯(cuò)誤。
- proxy_pass $scheme://$host$request_uri;
- proxy_set_header Host $http_host;
3.配置緩存大小,關(guān)閉磁盤緩存讀寫減少I/O,以及代理連接超時(shí)時(shí)間。
- proxy_buffers 256 4k;
- proxy_max_temp_file_size 0;
- proxy_connect_timeout 30;
4.配置代理服務(wù)器 Http 狀態(tài)緩存時(shí)間。
- proxy_cache_valid 200 302 10m;
- proxy_cache_valid 301 1h;
- proxy_cache_valid any 1m;
不支持代理 Https 網(wǎng)站:
因?yàn)?Nginx 不支持 CONNECT,所以無(wú)法正向代理 Https 網(wǎng)站(網(wǎng)上銀行,Gmail)。
如果訪問(wèn) Https 網(wǎng)站,比如:https://www.google.com,Nginx access.log 日志如下:
- "CONNECT www.google.com:443 HTTP/1.1" 400
#p#
第五步:添加nginx身份驗(yàn)證
身份驗(yàn)證一般有兩種方式,一種是使用ssl 443即證書(shū)的方式,另一種是使用htpasswd的方式,這里為了方便我選擇后者。
最后的效果就類似(不同瀏覽器的界面有所不同):
如果認(rèn)證失敗,就會(huì)報(bào)HTTP錯(cuò)誤:401 Authorization Required。
要實(shí)現(xiàn)這樣的功能,就需要更改服務(wù)器的配置,并設(shè)定好用于登錄的用戶名和密碼。
首先我們需要更改網(wǎng)站的Nginx的server配置,我們找到剛才配置正向代理的那個(gè)配置文件,在lication中添加兩行如下:
- cd/etc/nginx/conf.d/
- sudo vi default.conf
- server {
- # ...
- location / {
- # 添加下面兩行
- auth_basic "Restricted"; (Restricted為出錯(cuò)后的提示語(yǔ))
- auth_basic_user_file proxy.pwd; (proxy.pwd是秘鑰文件的文件名,這里應(yīng)為秘鑰文件的完整路徑,如下圖)
- # ...
- }
- # ...
- }
接下來(lái)需要?jiǎng)?chuàng)建htpasswd文件,這里有一些細(xì)節(jié)需要注意:
htpasswd的路徑:
和nginx.conf在同一級(jí)目錄即可。CentOS服務(wù)器的話一般就在/etc/nginx/下面。
htpasswd的內(nèi)容:
每一行為一個(gè)用戶,格式為username:password。但是要注意,這里的password不是明文,而是將password進(jìn)行crypt(3)加密后的字符串。
你可以使用一段PHP代碼來(lái)生成htpasswd中的password: 也可以使用網(wǎng)上的現(xiàn)在生成工具(不推薦),我的文件是老大直接給我的Python生成的。
- // 密碼明文
- $password = 'some password';
- // 對(duì)密碼進(jìn)行加密
- $password = crypt($password, base64_encode($password));
- // 獲得加密后的密碼
- echo $password;
然后將字符串寫入htpasswd文件中:
...
- username1:xucqMk13TfooE
- username2:YXTfb3xWKOMBM
htpasswd的權(quán)限:
需要更改htpasswd文件的權(quán)限,執(zhí)行如下命令:
- sudo chown root:www-data htpasswd
- sudo chmod 640 htpasswd
當(dāng)上面的準(zhǔn)備工作都做好之后,我們就可以重新載入或者重啟Nginx服務(wù)器了:
- sudo /etc/init.d/nginx reload
說(shuō)明:密碼文件導(dǎo)入的方法有很多,可以通過(guò)Xmanager Enterprise 4中的Xftp,還可以使用pscp.exe,如果倒不進(jìn)去的話還有最原始的辦法,在/etc/nginx/ 下新建文件proxy.pwd 然后將秘鑰中的文本考進(jìn)去即可。
原文鏈接:http://blog.csdn.net/llkaximoduo/article/details/42214721