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