centos7环境下在docker中nginx部署HTTPS

版权声明:本文为博主原创学习笔记,如需转载请注明来源: https://blog.csdn.net/wugenqiang/article/details/86531278

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=<SERVER-IP>'

完成后会在当前目录创建私钥文件(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)使用如下命令确认是否支持HTTPSSNI

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环境是否成功

猜你喜欢

转载自blog.csdn.net/wugenqiang/article/details/86531278