标签归档:https

两台nginx实现https负载均衡

现在网络完全越来越受到重视, 因此https也是大势所趋, 以往nginx都是工作在http方式下, 其实nginx在https下工作也挺好的。 这里将分步骤的逐步实现一套采用nginx, haproxy, keepalived实现的https系统, 并且系统没有单点故障, 基本适应中小系统的安全需要。

1. Nginx https安装    这个文章主要是安装支持https的nginx, 源代码装过程

2. https安装(2)nginx配置   继承上一个文章, 记录配置过程, 然后实现https服务

本文继承前两个文章, 记录通过nginx实现https的功能, 并且通过haproxy将两台nginx的https进行整合, 统一对外提供服务。

但是本文的方法, 在haproxy上仍然存在单点故障, 下一篇文章, 将修正这个错误

 

本文记录详细的安装过程, 供大家参考。

 一. 准备linux操作系统

本文的nginx和haproxy都是在linux下进行的安装与测试, 因此需要linux计算机。

我们采用vmware作为虚拟机软件, 采用下面的已经安装好的虚拟机镜像做为操作系统。 这样节省了安装时间。

链接:http://pan.baidu.com/s/1nutqTkP 密码:f4bh

  1. 安装好vmware软件, 这个百度上搜索, 或者参考:     虚拟机vmware新手使用教程
  1. 下载好虚拟机软件后解压缩到一个比较大的硬盘空间, 记录下目录地址
  2. 启动虚拟机软件, 在文件菜单中, 选择打开按钮, 然后选择好, 您刚才解压缩的文件目录, 选择其中*.vmx文件, 然后打开
  3. 选择运行这个软件, 最后您可以开始这个虚拟机了, 虚机运行后, 最后进入登录界面, 在登录界面中输入 root作为用户名, 密码为 thoughtpolice   或者root

或者查看README-vmware-image.txt 文件

  1. 进入虚拟机后, 使用 ifconfig命令, 检查一下 虚拟机是否网络已经正确启动, 并且查看一下, 这个虚拟机的ip地址
  2. 运行 setup命令, 进入防火墙选项 关闭防火墙
  3. 安装xshell软件, 在xshell软件里面配置一个连接到您虚拟机的连接, 然后连接上。这样方便后续的操作等
  4. 安装xftp软件  方便上传相关文件到服务器。

上述软件, 客户baidu搜索相关安装方法等。

二. nginx下https的安装和配置

  1. 安装https01服务器

本 文目标是测试多机负载均衡下https的工作状况, 因此我们需要安装至少2台nginx服务器, 并且每个服务器都要支持https协议, 因此我们需 要首先安装1台nginx, 然后在配置相关的https服务, 测试没问题了, 然后在站另外一台nginx, 最后安装负载均衡软件。

关于nginx的安装, https的安装, https的配置请参考下面的文章进行

Nginx https安装

https安装(2)nginx配置

参考上面文章, 安装配置完成nginx的https后, 进行测试一下, 配置文件为:

worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
  
    server {
        listen       80;
        server_name  test.iigrowing.cn;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
    server {
        listen       443;
        server_name  test.iigrowing.cn;
        ssl                  on;
        ssl_certificate      /etc/pki/tls/certs/rsyslog.crt;
        ssl_certificate_key  /etc/pki/tls/certs/rsyslog.key;
        ssl_session_timeout  5m;
        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers   on;
        location / {
            root   html;
            index  index.html index.htm;
        }
   }  
}
  1. 测试https01服务器

进入下图目录中, 编辑hosts文件, 添加一行记录

192.168.128.138  test.iigrowing.cn

另外, 请用您的正确ip地址替换上面的ip地址, 用您喜欢的域名替换测试的域名。 这里用域名就是方便, 啥域名或者使用ip不影响您的测试结果。

haproxy001

  1. 启动一个浏览器, 在浏览器里面输入 https://test.iigrowing.cn

然后, 应该能看到 正确的显示了额,

您也可用修改nginx的html目录下的 index.html文件的内容, 来仔细测试您的工作成果。

 

  1. 关闭这个https01服务器, 然后在vmware的虚拟机菜单中选择

haproxy002

最后在弹出菜单中选择  链接克隆选项  这样可以节省点磁盘空间。 虚拟机名称可为 https02

  1. 克隆完毕启动这个新的虚拟机。

启动虚拟机后, 要先登录, 然后立即检查是否网络启动正常, 以及网络的ip地址, 若是网络不正常。

请运行setup命令

haproxy003

之后选择这个

haproxy005

haproxy006

haproxy007

填写下面的信息

haproxy008

最后选择 保存退出, 然后运行下面的命令, 检查新网卡是否启动正常了

service network restart              启动网卡(英文部分为命令)

Ifconfig                           检查网络是否正常启动

  1. 在xshell中配置一个新的连接, 用这个配置连接到新的虚拟机
  2. 进入/usr/local/nginx/sbin下, 运行./nginx 启动nginx, 然后测试这个https是否正常工作了。

 

到此我们准备好了,两个有https功能的nginx, 另外两个nginx的证书等信息都是完全一致的, 我们是采用虚拟机clone进行的。里面数据是一致的。

 

 三. 安装haproxy

关于haproxy的功能, 安装配置详情请参考下面的文章

Haproxy学习笔记-源码安装

这里简单进行安装配置, 然后进行配置

  1. 下载软件源代码 wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.3.tar.gz

最后发现国外网站, 下载速度慢, 可以用本文提供的 下载好的版本

         haproxy-1.6.3.tar

  1. 下载本文提供的软件
  2. 启动xftp上传文件, 过程略
  3. 解压缩上传后的软件包
  4. 进入解压缩后的目录
  5. 运行make PREFIX=/usr/local/haproxy install  进行编译安装
  6. 最后执行 cd /usr/local/haproxy 目录
  7. 然后执行 mkdir conf  创建配置目录
  8. 进入文件目录, 执行vi haproxy.cfg  命令创建配置文件, 内容如下
global
    log 127.0.0.1 local0 info #[err warning info debug]
    maxconn 4096
    user root
    group root
    daemon
    nbproc 1
    pidfile /home/admin/haproxy/logs/haproxy.pid

defaults
    maxconn 2000
    contimeout 5000
    clitimeout 30000
    srvtimeout 30000

frontend https
    bind :443
    default_backend cluster_https

backend cluster_https
    mode tcp
    balance roundrobin
    server https01 192.168.128.136:443
    server https02 192.168.128.137:443

listen admin_stats
    bind 0.0.0.0:1080
    mode http
    log 127.0.0.1 local0 err
    stats uri /admin?stats
  1. 执行下面命令创建目录 mkdir -p  /home/admin/haproxy/logs/
  1. 执行  /usr/local/haproxy/sbin/haproxy  -f  /usr/local/haproxy/conf/haproxy.cfg
  2. 通过 netstat -ntlp  查看是否 启动了443端口
  3. 通过 http://test.iigrowing.cn:1080/admin?stats查看相关统计信息

haproxy009

 最后.  测试整个haproxy下的用nginx实现的https程序

  1. 登录https01服务器, 进入/usr/local/nginx/html 下  编辑html 修改内容, 添加些字符串 111111111111等, 这样方便我们了解到 我们访问的是https01机器
  2. 登录https02服务器, 进入/usr/local/nginx/html 下  编辑html 修改内容, 添加些字符串 222222222222等, 这样方便我们了解到 我们访问的是https01机器
  3. 启动firefox浏览器 输入 https://test.iigrowing.cn请确保协议时https, 另外域名解析到 haproxy的地址上。
  4. 在启动另外一个chrome浏览器, 然后同样输入上述的地址, 多次测试发现有时显示带 111有时显示带222的,测试基本正常

 

 

 

Nginx https安装

原创文章,转载请指明出处并保留原文url地址

现在网络完全越来越受到重视, 因此https也是大势所趋, 以往nginx都是工作在http方式下, 其实nginx在https下工作也挺好的。 这里将分步骤的逐步实现一套采用nginx, haproxy, keepalived实现的https系统, 并且系统没有单点故障, 基本适应中小系统的安全需要。

1. Nginx https安装    (本文)这个文章主要是安装支持https的nginx, 源代码装过程

2. https安装(2)nginx配置   继承上一个文章, 记录配置过程, 然后实现https服务

3. 两台nginx实现https负载均衡  介绍通过haproxy实现两个nginx的负载均衡, 解决nginx的单点故障

 

下面用到的几个文件, 已经下载好, 可以直接使用

openssl-0.9.8y.tar

pcre-8.33.tar

zlib-1.2.8.tar

1. Nginx的优点

Nginx作为WEB服务器,Nginx处理静态文件、索引文件、自动索引的效率非常高。

Nginx作为代理服务器,Nginx可以实现无缓存的反向代理,提高网站的性能

Nginx作为负载均衡服务器,内部可以支持PHP、也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载;

Nginx在性能方面:Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 。它支持内核Poll模型,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。

Nginx具有很高的稳定性,其它HTTP服务器当遇到访问的峰值,或者有人恶意发起

慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应只能重启服务器。例如当前Apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采

取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。Nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对Nginx来说毫无用处;

Nginx高可用方面:Nginx支持热部署,它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。

2. https

2.1. 什么是HTTPS

在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。SSL目前的版本是3.0,被IETF(Internet Engineering Task Force)定义在RFC 6101中,之后IETF对SSL 3.0进行了升级,于是出现了TLS(Transport Layer Security) 1.0,定义在RFC 2246。实际上我们现在的HTTPS都是用的TLS协议,但是由于SSL出现的时间比较早,并且依旧被现在浏览器所支持,因此SSL依然是HTTPS的代名词,但无论是TLS还是SSL都是上个世纪的事情,SSL最后一个版本是3.0,今后TLS将会继承SSL优良血统继续为我们进行加密服务。目前TLS的版本是1.2,定义在RFC 5246中,暂时还没有被广泛的使用。

对历史感兴趣的朋友可以参考http://en.wikipedia.org/wiki/Transport_Layer_Security,这里有对TLS/SSL详尽的叙述。

2.2 HTTPS到底安全吗?

这个答案是肯定的,很安全。谷歌公司已经行动起来要大力推广HTTPS的使用,在未来几周,谷歌将对全球所有本地域名都启用HTTPS,用户只要在搜索前用Google帐号登录,之后所有的搜索操作都将使用TLS协议加密,见:http://thenextweb.com/google/2012/03/05/google-calls-for-a-more-secure-web-expands-ssl-encryption-to-local-domains/。

2.3 HTTPS的工作原理

HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法。握手过程的简单描述如下:

1.浏览器将自己支持的一套加密规则发送给网站。

2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。

3.获得网站证书之后浏览器要做以下工作:

a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。

b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。

c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。

4.网站接收浏览器发来的数据之后要做以下的操作:

a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。

b) 使用密码加密一段握手消息,发送给浏览器。

5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。

这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。另外,HTTPS一般使用的加密与HASH算法如下:

非对称加密算法:RSA,DSA/DSS

对称加密算法:AES,RC4,3DES

HASH算法:MD5,SHA1,SHA256

其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏。

TLS握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。正是由于HTTPS非常的安全,攻击者无法从中找到下手的地方,于是更多的是采用了假证书的手法来欺骗客户端,从而获取明文的信息,但是这些手段都可以被识别出来,我将在后续的文章进行讲述。不过2010年还是有安全专家发现了TLS 1.0协议处理的一个漏洞:http://www.theregister.co.uk/2011/09/19/beast_exploits_paypal_ssl/,实际上这种称为BEAST的攻击方式早在2002年就已经被安全专家发现,只是没有公开而已。目前微软和Google已经对此漏洞进行了修复。见:http://support.microsoft.com/kb/2643584/en-us https://src.chromium.org/viewvc/chrome?view=rev&revision=90643

3. 采用nginx来搭建https服务器

3.1 准备虚拟机vmware

我们将采用vmware安装 linux虚拟机, 然后在linux虚拟机中, 安装nginx.

虚拟机采用从互联网下载好的虚拟机, 信息如下:

wps_clip_image-6971_thumb[1][1]

3.2 下载nginx

进入linux中, 输入:

wget http://nginx.org/download/nginx-1.5.3.tar.gz

下载nginx

wps_clip_image-3725_thumb[1]

解压缩:

tar xzvf nginx-1.5.3.tar.gz

配置nginx

./configure --with-http_stub_status_module --with-http_ssl_module

提示

./configure: error: the HTTP rewrite module requires the PCRE library.

You can either disable the module by using --without-http_rewrite_module

option, or install the PCRE library into the system, or build the PCRE library

statically from the source with nginx by using --with-pcre=<path> option.

需要安装 pcre程序

3.3 安装pcre

到http://www.pcre.org/下载 pcre程序(yum 安装后, nginx还是提示找不到相关类)

PCRE - Perl Compatible Regular Expressions

The PCRE library is a set of functions that implement regular expression pattern matching using the same syntax and semantics as Perl 5. PCRE has its own native API, as well as a set of wrapper functions that correspond to the POSIX regular expression API. The PCRE library is free, even for building proprietary software.

PCRE was originally written for the Exim MTA, but is now used by many high-profile open source projects, including Apache, PHP, KDE, Postfix, Analog, and Nmap. PCRE has also found its way into some well known commercial products, like Apple Safari. Some other interesting projects using PCRE include Chicken, Ferite, Onyx, Hypermail, Leafnode, Askemos, and Wenlin.

输入下面命令, 下载pcre程序

wget http://downloads.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fpcre%2Ffiles%2Fpcre%2F8.33%2F&ts=1379034447&use_mirror=jaist

tar xzvf pcre-8.33.tar.gz  解压缩

cd pcre-8.33 进入目录

./configure  && make && make install  配置编译, 安装

输出如下信息:

configure: error: You need a C++ compiler for C++ support.

wps_clip_image-6337_thumb[1][1]

yum install -y gcc-c++   安装编译器

安装完成 gcc-c++后, 再次安装  pcre, 安装成功过

进入nginx目录, 再次运行

./configure  --with-http_stub_status_module --with-http_ssl_module

有如下信息:

./configure: error: SSL modules require the OpenSSL library.

You can either do not enable the modules, or install the OpenSSL library

into the system, or build the OpenSSL library statically from the source

with nginx by using --with-openssl=<path> option.

wps_clip_image-8028_thumb[1]

我们还需要openssl(我们需要源代码, 经过测试,不指定源代码目录,还是安装不成功)

3.4 安装openssl

到网站:

http://www.openssl.org/source/

下载 openssl

wps_clip_image-26328_thumb[1][1]

wget http://www.openssl.org/source/openssl-0.9.8y.tar.gz

下载openssl源代码

解压缩

tar xzvf openssl-0.9.8y.tar.gz

配置openssl

./config --prefix=/usr/local/openssl

编译安装: make && make install

再次进入nginx安装目录, 配置nginx系统

./configure  --with-http_stub_status_module --with-http_ssl_module --with-openssl=/root/openssl-0.9.8y

输出结果如下:

./configure: error: the HTTP gzip module requires the zlib library.

You can either disable the module by using --without-http_gzip_module

option, or install the zlib library into the system, or build the zlib library

statically from the source with nginx by using --with-zlib=<path> option.

需要安装 zlib软件包

3.5 安装zlib

http://www.zlib.net/

wps_clip_image-23979_thumb[1][1]

wget http://zlib.net/zlib-1.2.8.tar.gz

下载: wget http://zlib.net/zlib-1.2.8.tar.gz

解压缩:tar xzvf zlib-1.2.8.tar.gz

cd zlib-1.2.8

ls

配置: ./configure

编译安装: make && make install

3.6 安装nginx并运行nginx

进入nginx目录, 输入如下命令:

./configure  --with-http_stub_status_module --with-http_ssl_module --with-openssl=/root/openssl-0.9.8y

make && make install  安装nginx系统

[root@iig nginx-1.5.3]# cd /usr/local/nginx/sbin/

[root@iig sbin]# ./nginx

./nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory

[root@iig sbin]#

运行nginx命令, 发现不能运行.

在搜索引擎查找,发现相关问题情况如下

在centos5.7  32位上编译安照 nginx-1.1.16 出错

[root@localhost conf]# /usr/local/nginx/sbin/nginx

/usr/local/nginx/sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory

从错误看出是缺少lib文件导致,进一步查看下

[root@localhost conf]# ldd $(which /usr/local/nginx/sbin/nginx)

linux-gate.so.1 =>  (0x0071b000)

libpthread.so.0 => /lib/libpthread.so.0 (0×00498000)

libcrypt.so.1 => /lib/libcrypt.so.1 (0×00986000)

libpcre.so.1 => not found

libcrypto.so.6 => /lib/libcrypto.so.6 (0×00196000)

libz.so.1 => /lib/libz.so.1 (0×00610000)

libc.so.6 => /lib/libc.so.6 (0x002d7000)

/lib/ld-linux.so.2 (0x006a8000)

libdl.so.2 => /lib/libdl.so.2 (0x008c3000)

可以看出 libpcre.so.1 => not found 并没有找到,进入/lib目录中手动链接下

[root@localhost lib]# ln -s libpcre.so.0.0.1 libpcre.so.1

在64位系统测试时, 发现需要进入  /lib64目录, 执行上述目录后, 才能启动nginx

然后在启动nginx  ok 了

wps_clip_image-13263_thumb[1]

[root@iig sbin]#  ldd $(which /usr/local/nginx/sbin/nginx)

linux-gate.so.1 =>  (0x00d47000)

libpthread.so.0 => /lib/libpthread.so.0 (0x00ba3000)

libcrypt.so.1 => /lib/libcrypt.so.1 (0x00bf0000)

libpcre.so.1 => not found

libdl.so.2 => /lib/libdl.so.2 (0x00b3b000)

libz.so.1 => /lib/libz.so.1 (0x00f3f000)

libc.so.6 => /lib/libc.so.6 (0x009f6000)

/lib/ld-linux.so.2 (0x009d8000)

重新启动nginx, 没有报错误, 这样 支持  https的nginx安装完毕.

在安装过程中, 还发现一些其他问题,如下:

wps_clip_image-23095_thumb[1][1]

由于客户的VPS上有一个需要信用卡认证网站,以便于从国外接受信用卡付款

但经过几次信用卡公司安全检测,总是给出一些高危提示

昨天晚上给这个机器升级了openSSL 和 openSSH 到最新版本

今天升级Nginx 时候报错

openssl/include/openssl/ssl.h Error 2

解决办法是将--with-openssl=<dir> 中的 dir 指向openSSL的源码目录

我昨天升级时候,将 openSSL放到了 /root 下,那么就是

--with-openssl=/root/openssl-VERSION

VERSION代表版本号码,具体要看你自己的版本是什么

 

相关文章

    https安装(2)nginx配置