标签:linux
12.17 Nginx负载均衡12.18 ssl原理
12.19 生成ssl密钥对
12.20 Nginx配置ssl
12.17 Nginx负载均衡
Nginx负载均衡目录概要
vim /usr/local/nginx/conf/vhost/load.conf // 写入如下内容
upstream qq_com
{
ip_hash;
server 61.135.157.156:80;
server 125.39.240.113:80;
}
server
{
listen 80;
server_name www.qq.com;
location /
{
proxy_pass http://qq_com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
upstream来指定多个web server
Nginx负载均衡
代理一台机器称为代理 ,代理两台机器就可以称为负载均衡
代理服务器后面可以有多个web服务器,多个web服务器去提供服务的时候,就可以实现一个负载均衡的功能
正常情况下,用户访问web服务器,是一台一台去请求;要么就是指定一个IP,把这域名解析到多台服务器上
案例
用户1 –> web1服务器
用户2 –> web2服务器
假设这时web1服务器挂掉了(宕机),用户1因为解析到了web1,但web1宕机了,所以就无法正常访问;
这时候若是用nginx的负载均衡,在web1宕机后,代理服务器就不会把请求发送给web1,这就是代理的一个优点,负载均衡的优点。
1.配置负载均衡,负载均衡的配置借助了upstream 模块
2.这里将qq.com作为演示对象
dig命令查看解析的IP——>yum install -y bind-utils
[root@tianqi-01 ~]# yum install -y bind-utils
[root@tianqi-01 ~]# dig qq.com
; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> qq.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9571
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;qq.com. IN A
;; ANSWER SECTION:
qq.com. 331 IN A 125.39.240.113
qq.com. 331 IN A 61.135.157.156
;; Query time: 14 msec
;; SERVER: 119.29.29.29#53(119.29.29.29)
;; WHEN: Thu Mar 15 22:06:46 CST 2018
;; MSG SIZE rcvd: 67
[root@tianqi-01 vhost]#
3.会看到返回出两个IP,这个就是域名解析,也就是qq.com解析到了两个IP上
4.这时候就可以用这两个125.39.240.113IP和61.135.157.156IP,去做负载均衡
5.写一个配置文件vim /usr/local/nginx/conf/vhost/load.conf
//写入以下内容
upstream qq_com //upstream后的名称自定义
{
ip_hash; //目的是为了让同一个用户始终保持在同一个机器上
server 61.135.157.156:80; //如果域名解析端口是80,这段配置上的指定端口80是可以省略的
server 125.39.240.113:80;
}
server
{
listen 80; //定义监听端口
server_name www.qq.com; //域名
location /
{
proxy_pass http://qq_com; //这里填写的是upstream 的名字
即“http://upstream”,因为作为一个模块,代理访问的是通过解析后的IP访问;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
保存退出
6.upstream来指定多个web server
当有多个服务器同时对一个域名提供服务的时候,长时间访问一个域名,在一定的时效内,会出现需要重新登录或者是说跳转到另外一个地址的服务器上;ip_hash,就是使通过这个代理访问的同一个域名的多个IP的服务器时,始终保持在一个IP上对这个域名进行访问。
7.在未加载配置的时候,本机去访问qq.com,回去访问默认虚拟主机
[root@tianqi-01 ~]# curl -x127.0.0.1:80 www.qq.com
This is the default site.
[root@tianqi-01 ~]#
8.测试访问qq.com
9.检查配置文件语法,并重新加载
[root@tianqi-01 ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@tianqi-01 ~]# /usr/local/nginx/sbin/nginx -s reload
[root@tianqi-01 ~]#
10.这时再来访问qq.com,会看到的是qq.com的主页,反馈回来的是网页的源码
11.这个就是负载均衡
[root@tianqi-01 vhost]# cat load.conf
upstream qq_com
{
ip_hash;
server 61.135.157.156:80;
server 125.39.240.113:80;
}
server
{
listen 80;
server_name www.qq.com;
location /
{
proxy_pass http://qq_com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
[root@tianqi-01 vhost]#
nginx代理和负载均衡的知识点
nginx不支持去代理https,也就是在配置文件中的server后不能写:443,是不支持的,只能代理http、tcp
若想要实现代理https,nginx监听443端口,但web服务必须是80端口
12.18ssl原理
ssl原理
https的相关知识点
要配置nginx和https,就需要首先去了解https是什么?
在访问一些网站的时候,会自动加上了https前标
http和https的区别
https通信是加密的,如果不加密,中间传输数据包的有时候会被截到,就会导致信息泄露,https就是对这个通信的数据包进行加密
SSL工作流程
浏览器发送一个https的请求给服务器;
服务器要有一套数字证书,可以自己制作(后面的操作就是阿铭自己制作的证书),也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥(加密)和私钥(解密);
服务器会把公钥传输给客户端;
客户端(浏览器)收到公钥后,(这个过程是浏览器判断的)会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机字符串(字符串1),并用收到的公钥加密;
客户端把加密后的随机字符串(字符串2)传输给服务器;
服务器收到加密随机字符串(字符串2)后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机字符串(字符串1)后,再用这串随机字符串(字符串1)加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);
服务器把加密后的数据传输给客户端;
客户端收到数据后,再用自己的私钥(字符串1)也就是那个随机字符串解密;
12.19 生成ssl密钥对
生成ssl密钥对目录概要
? cd /usr/local/nginx/conf
? openssl genrsa -des3 -out tmp.key 2048//key文件为私钥
? openssl rsa -in tmp.key -out aminglinux.key //转换key,取消密码
? rm -f tmp.key
? openssl req -new -key aminglinux.key -out aminglinux.csr//生成证书请求文件,需要拿这个文件和私钥一起生产公钥文件
? openssl x509 -req -days 365 -in aminglinux.csr -signkey aminglinux.key -out aminglinux.crt
? 这里的aminglinux.crt为公钥
生成ssl密钥对
在自己的虚拟机生成ssl 需要用到openssl工具
在虚拟上颁发一套证书(就是一套公钥和私钥),生成ssl,
1.首先得有一个openssl工具
2.切换到/usr/local/nginx/conf/目录下
[root@tianqi-01 ~]# cd /usr/local/nginx/conf/
[root@tianqi-01 conf]#
3.若是没有openssl工具,可以安装下
4.查看openssl工具是由哪个安装包安装的
[root@tianqi-01 conf]# rpm -qf `which openssl`
openssl-1.0.2k-8.el7.x86_64
[root@tianqi-01 conf]#
5.生成一个私钥,命令openssl genrsa -des3 -out tmp.key 2048
[root@tianqi-01 conf]# openssl genrsa -des3 -out tmp.key 2048
Generating RSA private key, 2048 bit long modulus
...........................................................................+++
.+++
e is 65537 (0x10001)
Enter pass phrase for tmp.key: //输入密码123456
Verifying - Enter pass phrase for tmp.key: //再次输入密码123456
[root@tianqi-01 conf]#
openssl genrsa -des3 -out tmp.key 2048
genrsa ,表示生成rsa格式的私钥
2048 ,2048长度
名字为 tmp.key
生成这个秘钥必须要有密码
6.在生成这个秘钥后比较麻烦,在nginx的配置文件里指定密码,每次访问浏览器,在https这个网址输入这个密码会很不方便,所以还需要去除这个密码
7.转换key,取消密码,命令 openssl rsa -in tmp.key -out gurui.key
-in 表示指定哪一个秘钥要被转换
-out 表示指定输出的
[root@tianqi-01 conf]# openssl rsa -in tmp.key -out tianqi.key
Enter pass phrase for tmp.key: //输入tmp.key的密码
writing RSA key
[root@tianqi-01 conf]#
8.这时候tmp.key和tianqi.key是属于同一个私钥
tmp.key,有密码
tianqi.key,没有密码
9.删除tmp.key
[root@tianqi-01 conf]# rm -f tmp.key
[root@tianqi-01 conf]#
10.生成证书请求文件,需要拿这个请求文件和私钥一起生成公钥
[root@tianqi-01 conf]# openssl req -new -key tianqi.key -out tianqi.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn //国家,2个字母
State or Province Name (full name) []:GuangDong //省或州
Locality Name (eg, city) [Default City]:ShenZhen //城市
Organization Name (eg, company) [Default Company Ltd]:cao //公司
Organizational Unit Name (eg, section) []:cao //组织
Common Name (eg, your name or your server's hostname) []:tianqi //您的主机名
Email Address []:cgjtaiyang@126.com //邮箱
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456 //设置密码123456
An optional company name []: //一个可选的公司名称
//用请求证书文件和私钥,生成一个公钥
[root@tianqi-01 conf]#
这里的信息可以不用填写,直接回车也行
11.因为这是自己给自己颁发的证书,可以随意填写,若是购买那些正式的证书,那证书的信息就需要填写相对应的信息
12.生成公钥,命令openssl x509 -req -days 365 -in tianqi.csr -signkey tianqi.key -out tianqi.crt
[root@tianqi-01 conf]# openssl x509 -req -days 365 -in tianqi.csr -signkey tianqi.key -out tianqi.crt
Signature ok
subject=/C=cn/ST=GuangDong/L=ShenZhen/O=cao/OU=cao/CN=tianqi/emailAddress=cgjtaiyang@126.com
Getting Private key
[root@tianqi-01 conf]#
-days 365 证书的日期是一年
13.tianqi.crt是公钥,tianqi.key是私钥
12.20 Nginx配置ssl
在有了公钥和私钥之后,配置nginx
?vim /usr/local/nginx/conf/vhost/ssl.conf//加入如下内容
server
{
listen 443;
server_name aming.com;
index index.html index.php;
root /data/wwwroot/aming.com;
ssl on;
ssl_certificate aminglinux.crt;
ssl_certificate_key aminglinux.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
? -t && -s reload //若报错unknown directive “ssl” ,需要重新编译nginx,加上--with-http_ssl_module
? mkdir /data/wwwroot/aming.com
? echo “ssl test page.”>/data/wwwroot/aming.com/index.html
? 编辑hosts,增加127.0.0.1 aming.com
? curl https://aming.com/
1.生成新的配置文件 vim /usr/local/nginx/conf/vhost/ssl.conf
[root@tianqi-01 ~]# vim /usr/local/nginx/conf/vhost/ssl.conf
添加以下内容
server
{
listen 443; //监听端口为443
server_name aming.com; //主机名
index index.html index.php;
root /data/wwwroot/aming.com; //root 目录
ssl on; //开启ssl
ssl_certificate tianqi.crt; //指定公钥
ssl_certificate_key tianqi.key; //指定私钥
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; //ssl 的协议
}
保存退出
ssl 的协议,一般情况下,三种协议都配置上
2.创建/data/wwwroot/aming.com目录
[root@tianqi-01 ~]# mkdir /data/wwwroot/aming.com
[root@tianqi-01 ~]#
3.检查配置文件语法
[root@tianqi-01 ~]# /usr/local/nginx/sbin/nginx -t
nginx: [emerg] unknown directive "ssl" in /usr/local/nginx/conf/vhost/ssl.conf:7
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
[root@tianqi-01 ~]#
报错:
因为不知道这个ssl 配置,先前在编译nginx的时候,并没有额外配置支持SSL的参数
[root@tianqi-01 ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.12.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
configure arguments: --prefix=/usr/local/nginx
[root@tianqi-01 ~]#
解决办法
重新编译nginx
4.重新编译nginx
[root@tianqi-01 ~]# cd /usr/local/src/nginx-1.12.1/
[root@tianqi-01 nginx-1.12.1]# ./configure --help |grep -i ssl
--with-http_ssl_module enable ngx_http_ssl_module
--with-mail_ssl_module enable ngx_mail_ssl_module
--with-stream_ssl_module enable ngx_stream_ssl_module
--with-stream_ssl_preread_module enable ngx_stream_ssl_preread_module
--with-openssl=DIR set path to OpenSSL library sources
--with-openssl-opt=OPTIONS set additional build options for OpenSSL
[root@tianqi-01 nginx-1.12.1]#
编译的时候需要加上--with-http_ssl_module
5.初始化./configure --prefix=/usr/local/nginx --with-http_ssl_module
[root@tianqi-01 nginx-1.12.1]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module
6.编译make && make install
[root@tianqi-01 nginx-1.12.1]# make && make install
7.查看nginx的编译参数,会看到增加了--with-http_ssl_module
[root@tianqi-01 nginx-1.12.1]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.12.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_ssl_module
[root@tianqi-01 nginx-1.12.1]#
8.检查配置文件语法错误
[root@tianqi-01 nginx-1.12.1]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@tianqi-01 nginx-1.12.1]#
9.重启nginx
[root@tianqi-01 nginx-1.12.1]# /etc/init.d/nginx restart
Restarting nginx (via systemctl): [ OK ]
[root@tianqi-01 nginx-1.12.1]#
10.查看监听端口,会看到多出一个443端口
[root@tianqi-01 nginx-1.12.1]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4439/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 807/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1049/master
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 4439/nginx: master
tcp6 0 0 :::22 :::* LISTEN 807/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1049/master
tcp6 0 0 :::3306 :::* LISTEN 1029/mysqld
[root@tianqi-01 nginx-1.12.1]#
11.切换目录路径,并创建一个测试文件
[root@tianqi-01 nginx-1.12.1]# cd /data/wwwroot/aming.com/
[root@tianqi-01 aming.com]# ls
[root@tianqi-01 aming.com]# vim index.html //创建一个测试文件
This is ssl.
保存退出
12.测试,若是直接访问会报400,这种情况不对的
[root@tianqi-01 aming.com]# curl -x127.0.0.1:443 https://aming.com/
curl: (56) Received HTTP code 400 from proxy after CONNECT
[root@tianqi-01 aming.com]#
13.要直接访问,在虚拟机中 /etc/写hosts
[root@tianqi-01 aming.com]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 www.123.com www.0000000.com www.8888.com aming.com
192.168.11.136 www.123.com
14.测试,不指定-x访问
[root@tianqi-01 aming.com]# curl https://aming.com/
curl: (60) Peer's certificate issuer has been marked as not trusted by the user.
More details here: http://curl.haxx.se/docs/sslcerts.html
curl performs SSL certificate verification by default, using a "bundle"
of Certificate Authority (CA) public keys (CA certs). If the default
bundle file isn't adequate, you can specify an alternate file
using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
the bundle, the certificate verification probably failed due to a
problem with the certificate (it might be expired, or the name might
not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
the -k (or --insecure) option.
[root@tianqi-01 vhost]#
就是说你这个证书被标记为不可信任了,因为这个证书是自己颁发的,但是实际上是已经配置成功了
15.在windows中的host文件添加,并保存
192.168.11.136 www.abc.com www.123.com 111.com aming.com
16.浏览器访问aming.com,会看到加载超时
17.这时查看虚拟机防火墙iptables -nvL,若是防火墙存在,可以直接ipbables -F清空所有规则,若不想清空所有规则可以增加443端口的规则
[root@tianqi-01 aming.com]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
4561 6712K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
4 240 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
1 52 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
33 3501 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 4142 packets, 1003K bytes)
pkts bytes target prot opt in out source destination
[root@tianqi-01 aming.com]# iptables -F
[root@tianqi-01 aming.com]#
18.这时再来访问https://aming.com,会提醒不安全;若想继续访问,点击高级,继续前往即可
19.这个就是自己颁发证书,浏览器不被信任的时候,会显示红色不安全 ,而不是绿色的
20.以后若想正常的访问https,可以去沃通买证书
标签:linux
原文地址:http://blog.51cto.com/13184900/2089598