一、准备SSL证书
腾讯云申请
阿里云申请、
自行申请
还有一步DNS验证,因为我这边已经申请了证书,不好演示了。也挺简单的,按照教程来就行了,在域名解析里面加一条DNS解析记录,然后点击验证,通过了,就申请成功了,然后下载nginx版本的证书压缩包,解压上传到服务器就可以了
*稍微需要注意下,腾讯云和阿里云的证书文件后缀有点不一样,腾讯云是xx.crt和xx.key,阿里云是xx.pem和xx.key,都可以正常使用
二、下载最新nginx镜像
docker pull nginx
1
三、新建几个目录,把nginx容器内的配置文件挂载到主机上
mkdir -p /usr/local/nginx/{conf,html,logs,ssl}
这一步的目的是:1方便后期修改配置文件 2容器删除后配置文件也会删除,相当于多了个备份
四、启动一个nginx临时容器,把配置文件复制过来,然后删除
启动一个nginx容器
docker run --name nginx -p 80:80 -d nginx
复制配置文件
docker cp nginx:/etc/nginx/nginx.conf /usr/local/nginx/conf/
docker cp nginx:/etc/nginx/conf.d /usr/local/nginx
复制完了,可以把这个容器删了,先停止再删除
docker stop nginx
docker rm nginx
这一步是为了获得正确的nginx配置文件格式
五、把SSL证书上传到服务器
上传到这个目录下面,ssl是我们刚才创建的目录
/usr/local/nginx/ssl
六、修改nginx.conf配置文件,配置SSL证书
server {
listen 80;
#填写绑定证书的域名
server_name _;
#把http的域名请求转成https,相当于用户访问http也可以自动跳转到https,避免出现网页提示不安全
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name _;
#证书文件名称
ssl_certificate_key /etc/nginx/ssl/xx.key;
#私钥文件名称 .crt和.pem都可以用
ssl_certificate /etc/nginx/ssl/xx.pem;
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/local/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
#首页
location / {
index index.php index.html index.htm;
client_max_body_size 50m;
#limit_rate 100k; 限制下载速度
include fastcgi_params;
#rewrite ^.*$ /index.php$request_uri break;
#ThinkPhp访问异常可以用下面的代码
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
break;
}
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
*注意:虽然证书存放位置是/usr/local/nginx/ssl,但是配置里面要写/etc/nginx/ssl而不是/usr/local/nginx/ssl,不然启动会报错,因为配置里面的绝对路径,都是在nginx容器里面的地址,和主机里面的目录地址是两个东西,后面启动目录挂载的时候,是可以读到证书的,不用担心。
七、正式启动nginx
docker run --name nginx -p 80:80 -p 443:443 \
-v /usr/local/nginx/html:/usr/share/nginx/html \
-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf/ \
-v /usr/local/nginx/conf.d:/etc/nginx/conf.d/ \
-v /usr/local/nginx/logs:/var/log/nginx \
-v /usr/local/nginx/ssl:/etc/nginx/ssl \
--privileged=true -d --restart=always nginx
--name nginx //容器名称
-p 80:80 -p 443:443 //将容器的80端口映射到服务器的80端口,将容器的443端口映射到服务器的443端口
-v aa:bb //将主机的aa目录挂载到容器的bb
--privileged=true //使用该参数,container内的root拥有真正的root权限,避免后面操作时提示无权限
--restart=always //能够使我们在重启docker时,自动启动相关容器
八、检查nginx是否成功启动
up运行中
访问服务器,提示这个,就是成功启动了
九、访问失败?
看下nginx日志,有没有报错
docker logs nginx
检查下服务器的80/443端口都打开吗?看下服务器安全组里面开了吗?还有问题可以评论留言
TIPS:
#不需要SSL的情况
server {
listen 80; # 监听80端口
server_name example.com www.example.com; # 自己的域名
location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8090; # 需要代理的地址:端口
}
}
配置完后,访问example.com、www.example.com的请求会被转发到服务器的8090端口
需要SSL的情况
如果不需要访问http的时候强制重定向为https,可以用下面的配置
# 非强制重定向https
server {
listen 80; #侦听80端口,如果强制所有的访问都必须是HTTPs的,这行需要注销掉
listen 443 ssl; #侦听443端口,用于SSL
server_name example.cn www.example.cn; # 自己的域名
# 注意文件位置,是从/etc/nginx/下开始算起的
ssl_certificate 1_example_bundle.crt;
ssl_certificate_key 2_example.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;
client_max_body_size 1024m;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 这里写的是我的腾讯云内网地址,不知道为啥,不能用127.0.0.1...
proxy_pass http://xxx.xx.xx.xx:8090;
}
}
如果需要访问http的时候强制重定向为https,可以用下面的配置
# 强制重定向
server {
listen 443 ssl;
server_name example.cn www.example.cn; # 自己的域名
# 注意文件位置,是从/etc/nginx/下开始算起的
ssl_certificate 1_example_bundle.crt;
ssl_certificate_key 2_example.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;
client_max_body_size 1024m;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 这里写的是我的腾讯云内网地址,不知道为啥,不能用127.0.0.1...
proxy_pass http://xxx.xx.xx.xx:8090;
}
}
server {
listen 80; # 监听80端口
server_name example.cn www.example.cn; # 绑定证书的域名
#把http的域名请求转成https
return 301 https://$host$request_uri;
}
启动Nginx
docker run -itd --name nginx -p 80:80 -p 443:443-v /nginx/conf.d/nginx.conf:/etc/nginx/conf.d/nginx.conf -v /nginx/cert:/etc/nginx -m 100m nginx
参数说明
-itd 后台运行
-p 指定端口80和443
-v 将本地的文件映射到docker中
配置文件 /nginx/conf.d/nginx.conf -> /etc/nginx/conf.d/nginx.conf
证书文件 /nginx/cert -> /etc/nginx
-m 限制使用内存大小
--name 指定名字为nginx