docker部署nginx php,内附nginx代理web服务及SSL配置

前言

本次通过 MobaXterm 连接到 linux 服务器主机远程搭建环境,全程命令+ vim编辑,改了 2 天终于搭建成功,项目成功启动。之前没有接触过这些技术栈这次也是临危受命,参考了很多教程,部署成功做一个整理也是一个分享。

背景

小程序上线发现开发工具正常启动,线上无法连接服务器后端代码,查询资料发现需要配置安全证书,Tomcat 搞了半天作罢,看网上说 Nginx 也可以配置 SSL,加上公司官网(PHP语言)网站也要通过 Nginx,所以有了这篇文章

对于新手的提示

  • -name 是容器名 v 是挂载映射 -link 是关联到某容器 -ip 是指定 Docker 中的 IP p 指定端口映射 -net 指定网段 d 后台运行
  • 如果你之前没有接触过docker像我一样是新手,那么cv之前一定要看清命令是什么意思,避免不必要的麻烦

Docker 命令

Nginx 相关

bash 复制代码
# 解释一下这里为什么要建立三个端口。80 和 443 都是官网用的,8082 是给我的小程序服务(Tomcat,也是部署在 Docker 中)用的
#(我本地已经建了 `cbdinnet` 这个网段,如果你不需要可以不加这一段,其他的配置信息根据自己的情况千万不要盲目 Copy)。
sudo docker run --name cbdnginx -p 80:80 -p 443:443 -p 8082:8082 --net=cbdinnet --ip 172.20.0.103 -d \\
  -v /home/cbdadmin/cbdwebsite/nginx/www/myphp:/usr/share/nginx/html \\
  -v /home/cbdadmin/cbdwebsite/nginx/conf/conf.d:/etc/nginx/conf.d \\
  -v /home/cbdadmin/cbdwebsite/nginx/logs:/var/log/nginx \\
  -v /home/cbdadmin/cbdwebsite/nginx/ssl:/etc/nginx/ssl \\
  --link cbdwebsitephp:php nginx

上面命令中 4 个挂载目录都需要手动在宿主机中创建,即

  • 用于放 PHP 项目:/home/cbdadmin/cbdwebsite/nginx/www/myphp
  • 用于放 Nginx 配置文件:/home/cbdadmin/cbdwebsite/nginx/conf/conf.d
  • 用于放 Nginx 日志:/home/cbdadmin/cbdwebsite/nginx/logs
  • 用于存放证书:/home/cbdadmin/cbdwebsite/nginx/ssl

随便你建在哪里跟我不一样都行,只要自己能记住。

PHP 相关

bash 复制代码
sudo docker run -d --name cbdwebsitephp --net=cbdinnet --ip 172.20.0.102 \\
  -v /home/cbdadmin/cbdwebsite/nginx/www/myphp:/www/myphp php:5.6-fpm

SSL 证书存放

把 SSL 证书(pem 和 key)丢到你主机的挂载目录里,我的是 /home/cbdadmin/cbdwebsite/nginx/ssl,文件下载可以去你买域名的地方,我是从阿里买的,申请成功直接可以选择 Nginx 资源下载,会得到一个 pem 和一个 key 文件。

Nignx配置文件修改

  1. 还记得刚刚我们创建容器的时候建了一个nginx配置文件的挂载目录嘛,现在在nginx配置文件的挂载目录/etc/nginx/conf.d下面新建一个 default.conf或修改原有的conf配置文件

    (再次声明,以下配置根据需要填写)

bash 复制代码
client_max_body_size 100m;
client_body_buffer_size 100m;

map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

gzip on;
gzip_buffers 4 16k;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;

server {
  listen 80;
  server_name www.abc.com; # 需要将 yourdomain 替你的域名。
  return 301 https://$host$request_uri;
}
ini 复制代码
server {
  listen 8082 ssl;
  server_name www.abc.com; # 需要将 yourdomain 替你的域名。
  ssl_certificate /etc/nginx/ssl/你的证书名.pem;
  # 私钥文件名称 .crt 和 .pem 都可以用
  ssl_certificate_key /etc/nginx/ssl/你的证书名.key;
  ssl_session_timeout 5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
  ssl_prefer_server_ciphers on;

  location / {
    proxy_pass <http://Tomcat 服务器 IP 地址>:端口;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    proxy_read_timeout 600;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
  }
}

server {
  listen 443 ssl;
  # 配置 HTTPS 的默认访问端口为 443。
  server_name www.abc.com;
  # 证书文件名称
  ssl_certificate /etc/nginx/ssl/你的证书.pem;
  # 私钥文件名称 .crt 和 .pem 都可以用
  ssl_certificate_key /etc/nginx/ssl/你的证书.key;
  ssl_session_timeout 5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  ssl_prefer_server_ciphers on;
  # 根目录
  root /usr/share/nginx/html;
  # Load configuration files for the default server block.
  include /etc/nginx/default.d/*.conf;
  client_max_body_size 4096m;
  location ~ \\.php$ {
    root /www/myphp;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    fastcgi_split_path_info ^((?U).+\\.php)(/?.+)$;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    include fastcgi_params;
  }
  location ~* \\.(ico|txt)$ {
    expires 30d;
  }
  # 首页
  location / {
    root /usr/share/nginx/html;
    index index.php index.html index.htm;
    if (!-e $request_filename) {
      rewrite ^(.*) /index.php last;
    }
  }
}

修改完毕保存,在docker nginx的容器里刷新配置文件或者直接重启 Nginx:

bash 复制代码
//docker nginx的容器里刷新配置文件
sudo docker exec -it 你的nginx容器名称 /bin/bash
nginx -s reload
//重启
sudo docker restart cbdnginx

验证是否成功

关于 Nginx + PHP

  1. Docker 打印 Nginx 与 PHP 日志看是否启动成功。
  2. 启动成功后还是打不开页面,我的方式是通过 curl 验证 Nginx 地址,当然你也可以直接去浏览器通过域名试一下,因为我之前试过没有任何报错信息所以很烦躁去网上搜了命令:
bash 复制代码
curl --insecure <https://172.20.0.103/>

返回正常的页面就是项目启动成功,如果报错 file not found,别无其他就是配置文件的项目路径不对,其他报错我会贴到下一篇文章。

关于https(SSL)

如配置所列,Nginx 中访问 https://域名:8082 跳转到了我服务器 Docker 容器中 WebServer 的 IP 地址,所以首先要保证 Nginx 的代理地址是通的

关于小程序

如果小程序还是没办法访问web服务器,第一,查看你的 app.json 中 URL 等地址是不是 https://域名:8082,其次就是验证公众号开发平台 - 开发管理 - 服务器域名 - request 域名是不是 https://域名:8082,一定要带端口号!

相关推荐
云上艺旅3 小时前
K8S学习之前站五:清理docker的overlay2 目录
学习·docker·云原生·kubernetes
黑色幽默灬5 小时前
【docker】部署MySQL容器
mysql·docker·容器
tonngw6 小时前
Docker 使用指南
运维·docker·容器
生活百般滋味,人生需要笑对。 --佚名7 小时前
docker安装rabbitmq
docker·容器·rabbitmq
香吧香8 小时前
Dockerfile 语法与常用命令
docker
郁大锤9 小时前
Docker 和 Docker Compose 的关系
运维·docker·容器
生活百般滋味,人生需要笑对。 --佚名9 小时前
docker安装redis
java·redis·docker
川石课堂软件测试11 小时前
涨薪技术|Kubernetes(k8s)之Pod环境变量
java·功能测试·docker·云原生·容器·kubernetes·单元测试
运维小子11 小时前
Dify平台离线镜像部署
运维·docker·容器·dify
前端wchen12 小时前
在 macOS 上轻松部署 Docker:详细安装与配置步骤
开发语言·网络·程序人生·macos·docker·mac·工具