nginx是一款高性能的Web服务器,可以用作反向代理和负载均衡。随着HTTPS的不断推进,越来越多的网站都开始转到HTTPS方式,HTTP仅仅作为重定向到HTTPS的途径。
本文介绍了如何在centos7服务器上搭建基于nginx的HTTPS服务器,并且支持SNI(服务器名称指示)。
1.准备域名和HTTPS证书
(1)域名准备:可参考博客免费申请tk域名
(2)HTTPS证书准备:
方法一:采用自签名证书
该类型证书可以通过以下命令行创建:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt -subj '/CN='
完成后会在当前目录创建私钥文件(privateKey.key)和证书文件(certificate.crt)。
部署后浏览器会提示不安全的证书。
由于该类型证书无法通过验证,通常只在某些特殊场景下使用(如HTTPS抓包)。
方法二:个人网站证书
通常可以申请免费的个人网站证书,如腾讯云(https://buy.cloud.tencent.com/ssl)、freessl(https://freessl.cn/)。
该类型证书基本可以满足个人使用,建议使用。
检查dns,是NS1.FREEWHA.COM和NS2.FREEWHA.COM
下面来申请个人网站证书:以www.enjoytoshare.tk域名为例进行申请
本人申请的是freessl(https://freessl.cn/),因为提供双域名证书,嘿嘿
1° 进入freessl官网(https://freessl.cn/)挑选证书类型购买
2°选中自己的方式验证即可
我采用的是文件验证,即HTTP验证那个,编写代码实现
代码在Github上(自行获取,可参考):ssl_test
2.部署服务器,添加映射,映射进docker
(1)使用如下命令确认是否支持HTTPS
和SNI
root@a97f033b8cc0:/# nginx -V
TLS SNI support enabled
表示SNI
已经启用;--with-http_ssl_module
表示支持HTTPS
(2)将证书文件和私钥文件放到/etc/nginx/ssl
目录下。
(3)在/etc/nginx/nginx.conf编辑配置文件,用于映射到docker容器中
events{
worker_connections 1024;
}
http{
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
}
server {
listen 443;
server_name localhost;
# ssl on;
root html;
index index.html index.htm;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/private.key;
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;
location / {
root html;
index index.html index.htm;
}
}
}
(4)在/usr/share/nginx/html/文件下有index.html,若无则新建
(5)运行一个nginx容器, 命名nginx
docker run -p 8080:80 -p 8081:443 -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf -v /usr/share/nginx/html:/usr/share/nginx/html -v /etc/nginx/ssl:/etc/nginx/ssl --name nginx -d nginx
启动以后,使用下面的命令查看是否会输Hello nginx,如果输出则表示启动成功,否则可以使用docker logs 容器ID查看错误日志
curl 127.0.0.1:8080
使用nginx反向代理的优点是:可以使用nginx实现HTTPS,而自己的Web服务使用HTTP。这样,开发、调试都很方便,也便于使用负载均衡。
(6)在服务器上安装nginx,用于转发端口和绑定域名
安装nginx之前要先安装必要环境
1°gcc:安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:
yum install gcc-c++
2°PCRE pcre-devel:PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:
yum install -y pcre pcre-devel
3°zlib:zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包内容进行 gzip 所以需要在 Centos 上安装 zlib 库。
yum install -y zlib zlib-devel
4°OpenSSL:OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
yum install -y openssl openssl-devel
好了接下来,安装nginx:
下载nginx:wget http://nginx.org/download/nginx-1.14.2.tar.gz
解压安装包: tar zxvf nginx-1.14.2.tar.gz
进入安装包目录:cd nginx-1.14.2
在nginx目录编译安装:./configure 默认安装地址是 /usr/local/nginx
为了和docker保持一致,地址更为/usr/share/nginx
采取自定义编译安装:
./configure --with-http_ssl_module --with-http_gzip_static_module --prefix=/usr/share/nginx
安装:make
安装:make install
执行: test -d
启动:[root@wugenqiang ~]# cd /usr/share/nginx/sbin
[root@wugenqiang sbin]# ./nginx
安装成功以后,在/etc/nginx/sites-available/下新建enjoytoshare.conf,然后来编写我们的配置文件
server {
listen 80;
server_name enjoytoshare.tk;
return 301 https://$server_name:8081$request_uri
}
编写以后,在/etc/nginx/sites-enabled/下添加软连接
mkdir ../sites-enabled
cd ../sites-enabled
# 添加软连接
ln -s ../sites-available/enjoytoshare.conf enjoytoshare
# 查看配置文件是否配置成功
nginx -t
# 重启你的本机nginx
./nginx -s reload
3.测试HTTPS环境是否成功