首页 > 代码库 > 在阿里云、微软Windows Azure、亚马逊AWS 上使用Nginx配置http正向代理服务器
在阿里云、微软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弹出以下窗体
双击刚才的新增项,弹出以下窗体
填入密码,选择记住密码,点击OK。登录成功。
说明:登录云主机有两种方式,一个是上面说的用户名密码方式,另一种是公钥,私钥的方式。为了方便运维的同学帮我将这5太云主机的远程登录方式都改成了用户名密码方式。如果选择公钥私钥方式,是没有办法输入密码的。
第二步:查看当前Linux版本信息。
因为本小白从网上查得配置nginx大多是基于某一版本的Linux的,所以我就想了解下本与主机的Linux版本。
使用命令:lsb——release -a
我这里安装的是CenOS 6.5。据说CenOS也是服务器端使用的最多的Linux版本。
第三步:安装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
yum
install
http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
安装完成后运行:service nginx start 会显示[OK]的字样。
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
最后的效果就类似(不同浏览器的界面有所不同):
如果认证失败,就会报HTTP错误:401 Authorization Required。要实现这样的功能,就需要更改服务器的配置,并设定好用于登录的用户名和密码。
首先我们需要更改网站的Nginx的server配置,我们找到刚才配置正向代理的那个配置文件,在lication中添加两行如下:
# ...
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 然后将秘钥中的文本考进去即可。
$password = ‘some password‘;
// 对密码进行加密
$password = crypt($password, base64_encode($password));
// 获得加密后的密码
echo $password;
username1:xucqMk13TfooE
username2:YXTfb3xWKOMBM
...
sudo chown root:www-data htpasswd
sudo chmod 640 htpasswd
sudo /etc/init.d/nginx reload
在阿里云、微软Windows Azure、亚马逊AWS 上使用Nginx配置http正向代理服务器