1 Ubuntu 20.04 上安装 Nginx
Nginx 发音 “engine x” ,是一个开源软件,高性能 HTTP 和反向代理服务器,用来在互联网上处理一些大型网站。它可以被用作独立网站服务器,负载均衡,内容缓存和针对 HTTP 和非 HTTP 的反向代理服务器。和 Apache相比,Nginx 可以处理大量的并发连接,并且每个连接占用一个很小的内存。
1.1 前提条件
在继续之前,保证以 sudo 用户身份登录,并且你不能运行 Apache 或者 其他处理进程在80端口和443端口。
1.2 安装 Nginx
Nginx 在默认的 Ubuntu 源仓库中可用。想要安装它,运行下面的命令:
sudo apt update
sudo apt install nginx
一旦安装完成,Nginx 将会自动被启动。你可以运行下面的命令来验证它:
// 设置nginx开机启动
systemctl start nginx.service
systemctl enable nginx.service
sudo systemctl status nginx
输出类似下面这样:
1.3 配置防火墙
现在你已经在你的服务器上安装和运行了 Nginx,你需要确保你的防火墙被配置好,允许流量通过 HTTP(80)和 HTTPS(443)端口。假设你正在使用UFW,你可以做的是启用 ‘Nginx Full’ profile
,它包含了这两个端口:
UFW 全称为 Uncomplicated Firewall,是 Ubuntu 系统上配置 iptables 防火墙的工具。UFW 提供一个非常友好的命令用于创建基于IPV4,IPV6的防火墙规则。
sudo ufw allow 'Nginx Full'
想要验证状态,输入:
sudo ufw status
输出将会像下面这样:
1.4 测试安装
想要测试你的新 Nginx 安装,在你的浏览器中打开http://YOUR_IP,你应该可以看到默认的 Nginx 加载页面,像下面这样:
1.5 Nginx 配置文件结构以及最佳实践
- 所有的 Nginx 配置文件都在
/etc/nginx/
目录下。 - 主要的 Nginx 配置文件是
/etc/nginx/nginx.conf
。 - 为每个域名创建一个独立的配置文件,便于维护服务器。你可以按照需要定义任意多的 block 文件。
- Nginx 服务器配置文件被储存在
/etc/nginx/sites-available
目录下。在/etc/nginx/sites-enabled
目录下的配置文件都将被 Nginx 使用。 - 最佳推荐是使用标准的命名方式。例如,如果你的域名是mydomain.com,那么配置文件应该被命名为
/etc/nginx/sites-available/mydomain.com.conf
- 如果你在域名服务器配置块中有可重用的配置段,把这些配置段摘出来,做成一小段可重用的配置。
- Nginx 日志文件(access.log 和 error.log)定位在
/var/log/nginx/
目录下。推荐为每个服务器配置块,配置一个不同的access和error。 - 你可以将你的网站根目录设置在任何你想要的地方。最常用的网站根目录位置包括:
/home/<user_name>/<site_name>
/var/www/<site_name>
/var/www/html/<site_name>
/opt/<site_name>
2 HTTPS介绍
HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。
特点
- 内容加密:采用混合加密技术,中间者无法直接查看明文内容;
- 验证身份:通过证书认证客户端访问的是自己的服务器;
- 保护数据完整性:防止传输的内容被中间人冒充或者篡改。
2.1 HTTP 原理
HTTPS 主要由两部分组成:HTTP + SSL / TLS,也就是在 HTTP 上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过 TLS 进行加密,所以传输的数据都是加密后的数据。
-
(1) 客户端的浏览器首先要通过网络与服务器建立连接,该连接是通过TCP来完成,一般 TCP 连接的端口号是80。 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和许可内容。
-
(2) 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容。
2.2 HTTPS 原理
- (1) 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器;
- (2) 服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数;
- (3) 客户端对服务器的证书进行验证(有关验证证书,可以参考数字签名),并抽取服务器的公用密钥;然后,再产生一个称作 pre_master_secret 的随机密码串,并使用服务器的公用密钥对其进行加密(参考非对称加 / 解密),并将加密后的信息发送给服务器;
- (4) 客户端与服务器端根据pre_master_secret以及客户端与服务器的随机数值独立计算出加密和 MAC密钥;
- (5) 客户端将所有握手消息的 MAC 值发送给服务器;
- (6) 服务器将所有握手消息的 MAC 值发送给客户端;
2.3 HTTPS 优缺点
优点
- 使用 HTTPS 协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
- HTTPS 协议是由 SSL+HTTP构建的可进行加密传输、身份认证的网络协议,要比HTTP安全,可防止数据在传输过程中被窃取、改变,确保数据的完整性;
- HTTPS 是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本;
缺点
- 相同网络环境下,HTTPS 协议会使页面的加载时间延长近 50%,增加 10%到 20%的耗电。此外,HTTPS 协议还会影响缓存,增加数据开销和功耗;
- 成本增加。部署 HTTPS 后,因为 HTTPS 协议的工作要增加额外的计算资源消耗,例如 SSL 协议加密算法和 SSL 交互次数将占用一定的计算资源和服务器成本。
3 配置HTTPS
3.1 准备
1. 一台可用的服务器
首先需要有一台可用的服务器,后续用作域名解析。如果没有服务器可以先购买一台云服务器。
2. 一个备案过的域名
需要一个备过案的域名,用于解析服务器的IP地址。在对应购买的域名的服务商网站控制台可以完成备案。
3. SSL证书
SSL证书有免费和收费两个渠道。
我们这边主要介绍腾讯云和阿里云(排名不分先后)两个免费申请SSL证书的方式,当然资金允许情况下也可以直接购买。
4. 阿里云申请免费SSL证书
阿里云免费证书规则:自2021年起,免费证书申请将切换到证书资源包下每个实名个人/企业主体在一个自然年内可以一次性领取20张免费证书,免费证书每张证书有效期一年。免费证书仅支持绑定一个单域名,不支持绑定通配符域名或者IP。
阿里云申请免费SSL证书文档:官方文档地址
5. 腾讯云申请免费SSL证书
腾讯云免费证书规则:只支持绑定1个域名,可以支持绑定二级域名 abc.com、或是三级域名 example.abc.com。同一主域最多只能申请20张免费证书,每张有效期一年,免费证书到期后如需继续使用证书,需要重新申请并安装。
腾讯云申请免费SSL证书文档:官方文档地址
3.2 域名升级成HTTPS
我们如果直接用域名解析IP地址,域名也是可以访问的,但是是HTTP环境的。 我们使用的Nginx来配置升级HTTPS
Github地址:完整的单域名nginx.conf文件配置(清晰注释) – 点击进入
当我们在上面申请成功免费的SSL证书之后,点击下载证书。
下载完成会得到一个压缩包,我们解压之后选择Nginx文件夹,里面的两个文件就是我们后续需要配置的文件。 下载到本地的压缩文件包解压后Nginx文件夹包含:
- .pem文件:是证书文件;
- .key文件:证书的私钥文件。
这时候我们打开我们的SSH工具,进入Nginx的配置:
// 进入nginx目录,默认安装在/etc/nginx,这个目录如果未找到,可以根据nginx安装的位置进入
cd /etc/nginx
步骤一
在Nginx的安装目录下创建cert目录,并且将下载的全部文件拷贝到 /etc/nginx/cert
目录中(使用SSH工具附带的本地文件上传功能,将本地证书文件和密钥文件上传到Nginx服务器的证书目录[示例中为 /etc/nginx/cert
])。如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为a.key;
步骤二
然后开始Nginx配置,编辑Nginx配置文件(nginx.conf)
// 进入nginx目录,默认安装在/etc/nginx,这个目录如果未找到,可以根据nginx安装的位置进入
cd /etc/nginx// 编辑nginx的配置文件
vi nginx.conf
步骤三
修改与证书相关的配置内容按i键进入编辑模式,增加代码,监听443端口,如下
server {listen 443 ssl;listen [::]:443;server_name localhost;ssl on;root /usr/share/nginx/html;index index.html index.htm;#证书文件名称ssl_certificate cert/a.crt;#私钥文件名称ssl_certificate_key cert/a.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_prefer_server_ciphers on;# Load configuration files for the default server block.include /etc/nginx/default.d/*.conf;location / {}error_page 404 /404.html;location = /40x.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}
步骤四
执行命令 /sbin/nginx -s reload
重启服务器即可!(如果重启未成功,说明配置文件nginx.conf错误,检查是否有错误,后执行重启)
步骤五
验证是否安装成功,证书安装完成后,可通过访问证书的绑定域名验证该证书是否安装成功。
上述步骤成功之后,我们就可以通过 https://www.域名.com
来访问我们网站了,但是问题来了,因为我们申请的免费SSL证书是单域名绑定,也就是只能让https://www.域名.com
下的内容实现HTTPS访问,我们的二级域名 api.域名.com
还是只能 HTTP 访问。
参考
- 如何在 Ubuntu 20.04 上安装 Nginx:https://www.itcoder.tech/posts/how-to-install-nginx-on-ubuntu-20-04/
- 网站还是HTTP?快把你的域名和二级域名变成HTTPS:https://juejin.cn/post/6953649812097122312
- Nginx配置HTTP跳转到HTTPS:https://juejin.cn/post/7044911075480829959