前言
本次通过 MobaXterm 连接到 linux 服务器主机远程搭建环境,全程命令+ vim编辑,改了 2 天终于搭建成功,项目成功启动。之前没有接触过这些技术栈这次也是临危受命,参考了很多教程,部署成功做一个整理也是一个分享。
背景
小程序上线发现开发工具正常启动,线上无法连接服务器后端代码
,查询资料发现需要配置安全证书,Tomcat 搞了半天作罢,看网上说 Nginx 也可以配置 SSL,加上公司官网(PHP语言)网站也要通过 Nginx,所以有了这篇文章
对于新手的提示
-name
是容器名v
是挂载映射-link
是关联到某容器-ip
是指定 Docker 中的 IPp
指定端口映射-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配置文件修改
-
还记得刚刚我们创建容器的时候建了一个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
- Docker 打印 Nginx 与 PHP 日志看是否启动成功。
- 启动成功后还是打不开页面,我的方式是通过 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
,一定要带端口号!