分布式进阶 (二十三):Nginx 服务器应用详解

一、前言
Nginx作为一个异步框架的 Web服务器,也可以用作反向代理,负载平衡器 和 HTTP缓存,下面本篇文章就来介绍一下Nginx反向代理、SSL及域名配置。
基于公司中标某公司项目,作为项目产品组一员,前期负责服务器环境搭建部分。技术架构如下:
其中,主要实现点如下:
基于外网 APP 访问内网 Web 服务需求,应用
nginx反向代理解决。基于内网 Web 服务访问外网 Internet 服务需求,应用
nginx正向代理解决。随着访问并发量的增加,反向代理服务器会逐渐成为整个系统架构中的瓶颈点,容易出现单点故障,故考虑做方向代理服务器集群。
同时考虑到网络安全,对报文进行
SSL传输加密处理。外网 APP 通过域名方式访问反向代理服务器,故需要申请外网域名。
二、环境搭建
2.1 Nginx 安装
上传Nginx安装包到服务器
2.2 Nginx 配置
将
nginx_config.zip解压。
将解压后的
nginx.conf和conf.d/default.conf替换至服务器/etc/nginx/中的相应文件。将/dtap 文件夹中的
aimonitor-front的前端文件夹压缩,并复制至 nginx 安装目录(/usr/share/nginx/html/),改名为AImonitor
修改
nginx.conf和conf.d/default.conf中的 IP 信息。将 22.188.15.205 改为服务器地址。启动
nginx
如果启动成功,效果如下
当修改了配置文件使用:
建议不要停止再重启,以防报错。
二、反向代理配置
2.1 什么是反向代理?
反向代理和正向代理的区别就是:正向代理代理客户端,反向代理代理服务器。
反向代理(Reverse Proxy),其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
2.2 反向代理的好处
保护了真实的 web 服务器,web 服务器对外不可见,外网只能看到反向代理服务器,而反向代理服务器上并没有真实数据,因此,保证了 web 服务器的资源安全。
反向代理为基础产生了动静资源分离以及负载均衡的方式,减轻 web 服务器的负担,加速了对网站访问速度。
节约了有限的 IP 地址资源,企业内所有的网站共享一个在 Internet 中注册的 IP 地址,这些服务器分配私有地址,采用虚拟主机的方式对外提供服务;
2.3 http 反向代理配置信息
nginx反向代理http配置步骤如下:
vi /etc/nginx/nginx.conf新增如下配置信息:
nginx -s reload重新加载配置。
三、反向代理集群搭建(待补充)
四、正向代理配置
4.1 什么是正向代理?
前面提到过,正向代理代理客户端,反向代理代理服务器。
理解正向代理、反向代理这两种代理的关键在于代理服务器所代理的对象是什么,正向代理代理的是客户端,我们需要在客户端进行一些代理的设置。而反向代理代理的是服务器,作为客户端的我们是无法感知到服务器的真实存在的。
4.2 http 正向代理配置信息
正向代理:如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
Nginx配置如下:
Nginx 正向代理配置说明:
配置
DNS解析IP地址,比如Google Public DNS,以及超时时间(5 秒)。
配置正向代理参数,均是由
Nginx变量组成。其中proxy_set_header部分的配置,是为了解决如果URL中带 "."(点)后Nginx503 错误。
配置缓存大小,关闭磁盘缓存读写减少
I/O,以及代理连接超时时间。
配置代理服务器
Http状态缓存时间。
注意⚠️:nginx 正向代理不支持代理 Https 网站。
因为 Nginx 不支持 CONNECT,所以无法正向代理 Https 网站。如果访问 Https 网站,比如:https://www.google.com,Nginx access.log 日志如下:
配置完nginx之后, nginx -s reload重新加载配置。
如果出现80端口被占用,Lsof -i :80 查看 80 端口的pid进程号,然后用Kill -9 +进程号,删除进程,再重启服务。
查看dns方法
4.3 正向代理使用
在需要访问外网的机器上(Linux 系统)执行以下操作之一即可:
其中,yourproxyaddress 也就是你的Nginx服务器的 ip 了,proxyport就是上面配置中的 80,可以根据自己的需要修改。
4.4 Nginx 支持正向代理 https
nginx本身是不支持https协议请求转发,为了让nginx能达到这一效果需要借助第三方模块ngx_http_proxy_connect_module。首先下载这一模块到服务器,然后准备nginx环境。
编译安装成功后,配置nginx正向代理:
当配置文件配置好之后保存即可,重启nginx,进行测试:
nginx -s reload重新加载配置。
去内网服务器里curl,可以在环境变量里添加代理:
另一种方式不用加环境变量,临时代理
4.4 正向、反向代理对比
通过四、五章节的讲解,正向代理代理客户端,反向代理代理服务器。可以看到反向代理服务器对客户端透明,客户端无需任何配置,只需访问反向代理服务器 IP,即可实现访问内网服务。Nginx 反向代理服务器只需配置相应的代理规则即可。
正向代理代理客户端,需要在作为 Nginx 正向代理服务器中配置相应的代理规则,配置方式与反向代理基本一致,同一服务器既作为反向代理服务器、又作为正向代理服务器,是由监听端口转发。Nginx 作为正向代理服务器无法代理 Https,若需支持的话,需要额外安装第三方模块ngx_http_proxy_connect_module。
五、SSL 配置
5.1 敲黑板
随着互联网的快速发展,给我们的生活带来便利的同时,也伴随着网络钓鱼、信息泄露、网络诈骗等网络安全事件的频繁发生,企业网站被钓鱼网站仿冒,遭受经济损失,影响品牌形象。
如果网站不使用SSL证书,数据以HTTP明文传输,极容易被第三方监听、截取和篡改,而导致用户信息被泄露,给在线用户带来直接损失。通过部署SSL证书后能确保信息传输的安全性,可防止信息泄露。
SSL(Secure Sockets Layer安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。
SSL证书是数字证书(数字证书包括:SSL 证书、客户端证书、代码签名证书等)的一种,因为配置在服务器上也称为服务器SSL证书。SSL证书就是遵守SSL协议,由受信任的数字证书颁发机构CA(如:沃通 CA)在验证服务器身份后颁发的一种数字证书,它使用ssl协议在浏览器和web server之间建立一条安全通道,数据信息在client与server之间的安全传输.。
SSL协议的特点:
SSL协议可用于保护正常运行于TCP之上的任何应用协议,如HTTP、FTP、SMTP或Telnet的通信,最常见的是用SSL来保护HTTP的通信。
SSL协议的优点在于它是与应用层协议无关的。高层的应用协议(如HTTP、FTP、Telnet等)能透明地建立于SSL协议之上。
SSL协议在应用层协议之前就已经完成加密算法、通信密钥的协商以及服务器的认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的安全性。
SSL的功能 :
客户对服务器的身份认证。
SSL服务器允许客户的浏览器使用标准的公钥加密技术和一些可靠的认证中心(CA)的证书,来确认服务器的合法性。服务器对客户的身份认证。也可通过公钥技术和证书进行认证,也可通过用户名,password 来认证。
建立服务器与客户之间安全的数据通道。
SSL要求客户与服务器之间所有发送的数据都被发送端加密、接收端解密,同时还检查数据的完整性。
使用SSL证书的优势:
SSL证书用于实现数据加密传输,防止数据被泄露和篡改;用于认证服务器身份,防范被钓鱼网站攻击;
用于消除浏览器地址栏发出的“不安全”警告;
提高
SEO搜索引擎排名;提升用户对网站的信任;
有助于提高网站的在线销售业绩;
配置SSL模块首先需要CA证书,CA证书可以自己手动颁发也可以在阿里云申请。
默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译nginx时指定–with-http_ssl_module参数。
5.2 CA 证书生成
本小节主要讲述如何通过证书签名生成 CA 证书。
首先确认nginx服务器已经安装openssl和nginx已经编译ssl的模块。
生成秘钥和 CA 证书步骤:
步骤 1:生成 key 秘钥
步骤 2:生成证书签名请求文件(csr 文件)
步骤 3:生成证书签名文件(CA 文件)
5.2.1 生成 key 秘钥
首先,创建一个用来存放秘钥的文件夹。
输入加密算法:openssl genrsa -idea -out jesonc.key 1024
回车,会让输入密码,这里设置为 123456,完成后会生成一个.key的文件
5.2.2 生成证书签名请求文件(csr 文件)
5.2.3 生成证书签名文件(CA 文件)
打包:openssl x509 -req -days 3650 -in jesonc.csr -signkey jesonc.key -out jesonc.crt
5.3 https 反向代理配置信息
https 默认采用 SHA-1 算法,非常脆弱。我们可以使用迪菲-赫尔曼密钥交换。
我们在 /conf/ssl 目录下生成 dhparam.pem 文件
下面的配置 ssl_protocols 和 ssl_ciphers 是用来限制连接只包含 SSL/TLS 的加強版本和算法。
进入/etc/nginx/conf.d/
如果要实现http强制跳转到https,可以添加下面配置段:
注意⚠️:网上也有许多使用
rewrite来重定向,但是return指令简单高效,建议尽量使用return。
配置好之后,nginx -s reload重新加载配置。
确认已启用 443 的监听:netstat -luntp|grep 443
上面server部分第 2-5 项是关键。这些配置放在 server 块就可以对其中的所有 location 生效了,并且同时支持 http 和 https 。或者把 http 和 https 分开配置也很常见。
5.3.1 合并证书配置文件
和Apache配置不同,Nginx需要将服务器证书和 ca 证书链合并到一个文件中,作为 ssl_certificate 配置内容。例如,按照证书链从下向上的顺序,我有三个证书:
ssl.crt(自己域名的服务器证书)sub.class1.server.ca.pem(startssl的一类证书)ca.pem(startssl的根证书)把它们的内容按顺序连接到的一个文件中,每个内容另起一行,中间没有空行或空格。
5.3.2 避免启动时输入密码
配好之后,启动nginx 会要你输入密钥的密码。这是因为 ssl_certificate_key 配置对应的文件(也就是 startssl 给你的私钥文件)内容是加密的,需要输入你创建这个时设置的密码才能解密。这样私钥虽然很安全,但是每次重启服务都要输入一次密码也太麻烦了。其实,只要证书改为解密了的内容,就可以避免每次输入密码。用如下命令即可:openssl rsa -in ssl.key -out newssl.key 输入密码,就生成了解密后的私钥内容,使用这个就 OK 了。
但是就像前面说的,一定要在服务器上保护好它,例如:
5.3.3 优化 SSL 配置
SSL 很消耗 CPU 资源,尤其是在建立连接的握手阶段。一是通过开启 keepalive 可以重用连接。二是可以重用和共享ssl session,见上面ssl_session相关配置。
会话存储在工作人员之间共享的 SSL 会话缓存中,并由 ssl_session_cache 参数配置。1 兆字节的缓存包含大约 4000 个会话。默认缓存超时为 5 分钟。它可以通过使用增加 ssl_session_timeout 指令。
六、域名申请(待补充)
七、拓展阅读
nginx -s stop快速停止
nginx -s quit完整停止
nginx -s reload重新加载配置
ps -ef | grep nginx查看进程 id
kill [option] 进程idoption: (1) -9 强制杀死; (2)TERM 或 INT 快速停止服务; (3)QUIT 平缓停止
nginx -v查看版本
nginx -t检查配置文件关闭:nginx -s stop -c /etc/nginx/nginx.conf启动:nginx -c /etc/nginx/nginx.conf
八、延伸阅读
版权声明: 本文为 InfoQ 作者【No Silver Bullet】的原创文章。
原文链接:【http://xie.infoq.cn/article/0a047242abb928ca99cf6bf32】。文章转载请联系作者。











评论