在本文中,我想与您分享一种为您的Docker Web应用程序创建SSL证书的方法,如下 在Internet的俄语部分中-我没有找到类似的解决方案。

削减更多细节。
我们有docker v.17.05,docker-compose v.1.21,Ubuntu Server 18和一品脱干净的Let'sEncrypt。 并不是说有必要在Docker上部署生产。 但是,如果您开始收集Docker,将很难停止。因此,对于初学者来说,我将为您提供标准设置-我们在开发阶段即已 通常没有443端口和SSL:
docker-compose.ymlversion: '2' services: php: build: ./php-fpm volumes: - ./StomUp:/var/www/StomUp - ./php-fpm/php.ini:/usr/local/etc/php/php.ini depends_on: - mysql container_name: "StomPHP" web: image: nginx:latest ports: - "80:80" - "443:443" volumes: - ./StomUp:/var/www/StomUp - ./nginx/main.conf:/etc/nginx/conf.d/default.conf depends_on: - php mysql: image: mysql:5.7 command: mysqld --sql_mode="" environment: MYSQL_ROOT_PASSWORD: xxx ports: - "3333:3306"
nginx / main.conf server { listen 80; server_name *.stomup.ru stomup.ru; root /var/www/StomUp/public; client_max_body_size 5M; location / { # try to serve file directly, fallback to index.php try_files $uri /index.php$is_args$args; } location ~ ^/index\.php(/|$) { #fastcgi_pass unix:/var/run/php7.2-fpm.sock; fastcgi_pass php:9000; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; internal; } location ~ \.php$ { return 404; } error_log /var/log/nginx/project_error.log; access_log /var/log/nginx/project_access.log; }
接下来,我们实际上需要实现SSL。 老实说-我研究了大约2个小时的com区域I。 那里所有建议的选项都很有趣。 但是在项目的当前阶段,我们(业务)需要快速可靠地将
Let'sEnctypt SSL与
nginx容器绑定。
首先,我们在服务器上安装了
certbotsudo apt-get install certbot
接下来,我们为我们的域生成了通配符证书
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
执行后,certbot将为我们提供2个TXT记录,这些记录需要在DNS设置中指定。
_acme-challenge.stomup.ru TXT {CertBot}
然后按回车。
之后,certbot将检查DNS中这些记录的可用性并为您创建证书。
如果添加了证书,但是certbot找不到,请尝试在5-10分钟后重新启动命令 。
好吧,在这里,我们是90天的Let'sEncrypt证书的骄傲拥有者,但是现在我们需要将其发送给Docker。
为此,请在docker-compose.yml中以最平庸的方式在nginx部分-链接目录。
带有SSL的Docker-compose.yml示例 version: '2' services: php: build: ./php-fpm volumes: - ./StomUp:/var/www/StomUp - /etc/letsencrypt/live/stomup.ru/:/etc/letsencrypt/live/stomup.ru/ - ./php-fpm/php.ini:/usr/local/etc/php/php.ini depends_on: - mysql container_name: "StomPHP" web: image: nginx:latest ports: - "80:80" - "443:443" volumes: - ./StomUp:/var/www/StomUp - /etc/letsencrypt/:/etc/letsencrypt/ - ./nginx/main.conf:/etc/nginx/conf.d/default.conf depends_on: - php mysql: image: mysql:5.7 command: mysqld --sql_mode="" environment: MYSQL_ROOT_PASSWORD: xxx ports: - "3333:3306"
你有联系吗? 超级-继续:
现在,我们通常需要更改
nginx配置以与端口
443和
SSL一起使用:
使用SSL的Main.conf配置示例 # server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name *.stomup.ru stomup.ru; set $base /var/www/StomUp; root $base/public; # SSL ssl_certificate /etc/letsencrypt/live/stomup.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/stomup.ru/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/stomup.ru/chain.pem; client_max_body_size 5M; location / { # try to serve file directly, fallback to index.php try_files $uri /index.php$is_args$args; } location ~ ^/index\.php(/|$) { #fastcgi_pass unix:/var/run/php7.2-fpm.sock; fastcgi_pass php:9000; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; internal; } location ~ \.php$ { return 404; } error_log /var/log/nginx/project_error.log; access_log /var/log/nginx/project_access.log; } # HTTP redirect server { listen 80; listen [::]:80; server_name *.stomup.ru stomup.ru; location / { return 301 https://stomup.ru$request_uri; } }
实际上,在进行了这些操作之后-我们使用Docker-compose进入目录,将docker-compose up -d写入。 然后我们检查SSL的功能。 一切都应该起飞。
最重要的是不要忘记Let'sEnctypt证书已发布90天,您将需要通过
sudo certbot renew
更新它,然后使用
sudo certbot renew
docker-compose restart
重新启动项目
或者,将此序列添加到crontab。
我认为,这是将SSL连接到Docker Web应用程序的最简单方法。
PS:请注意,本文中介绍的所有脚本都不是最终的,现在该项目处于开发阶段,因此,我想请您不要批评配置文件-它们将被修改很多次。