docker 安装
关于docker的安装,可以参考其他文章或者同系列搭建自己的服务器环境之四安装Docker
# 先创建要挂载的目录
mkdir -p /opt/nginx/conf && mkdir -p /opt/nginx/conf.d && mkdir -p /opt/nginx/html && mkdir -p /opt/nginx/log && mkdir -p /opt/nginx/cert
# 获取镜像
docker pull nginx:stable-perl
# 先启动容器,让其在后台运行,这个不重要,主要是将配置文件拷贝出来
docker run -d --name nginx nginx:stable-perl
# 将默认配置文件拷贝到宿主机备用
docker cp nginx:/etc/nginx/conf.d /opt/nginx/conf.d
docker cp nginx:/etc/nginx/nginx.conf /opt/nginx/conf
# 停掉容器并将其删除
docker stop nginx
docker rm nginx
# 挂在宿主机目录启动容器
docker run -d --name nginx -p 80:80 -p 443:443 -v /opt/nginx/log:/var/log/nginx -v /opt/nginx/conf.d:/etc/nginx/conf.d -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/nginx/cert:/etc/nginx/cert -v /opt/nginx/html/:/usr/share/nginx/html nginx:stable-perl
挂载目录详解
宿主机 | 容器 | 用处 |
---|---|---|
/opt/nginx/log | /var/log/nginx | 日志文件目录 |
/opt/nginx/conf.d | /etc/nginx/conf.d | 默认配置文件目录 |
/opt/nginx/conf/nginx.conf | /etc/nginx/nginx.conf | 核心配置文件 |
/opt/nginx/html/ | /usr/share/nginx/html | web资源目录 |
/opt/nginx/cert/ | /usr/share/nginx/cert | 证书文件预留目录 |
直接访问ip, 如果服务器80端口是开放的话,将直接能够看到nginx的默认欢迎界面
默认配置测试
自己上传个首页或者文档之类的,测试配置文件和静态资源的访问是否正常
根据上面挂载规则, 将资源放入到宿主机的/opt/nginx/html
目录下, 修改/opt/nginx/conf/nginx.conf
user nginx;
worker_processes 4;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
charset utf-8;
gzip on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
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_set_header Server_Addr $server_addr;
proxy_set_header Server_Name $server_name;
# 项目如果支持websocket 需要在下面的location下配置请求头
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
root /usr/share/nginx/html;
index index.html;
}
}
}
再次访问ip,可以看到自定义的首页内容
配置https
前提
- 网站要有自己的域名
- 配置了域名解析
- 域名实名认证通过
- 域名备案成功(这一点如果要用443端口则必须要满足,再申请期间可以先用其他端口来测试证书安装)
https://freessl.cn(免费)
填入域名
邮箱
下载安装步骤省略
填入信息,点击开始生成文件
浏览器继续操作
这里的意思是按照网站的提示到自己的域名解析控制台添加记录, 这样用来证明这个域名确实是自己所有的
注意记录类型选择TXT, 主机记录和记录值按照浏览器上提示输入然后保存
再域名解析控制台配置好之后,回到浏览器点击验证按钮,
生成之后点击保存到KeyManager, 然后在KeyManager的证书管理即可看到证书信息
导出证书
按需选择类型
导出之后是个压缩文件,包含crt文件和key
将证书文件上传到服务器, 这个按照自己实际情况调整路径
#########这个的前提是前面安装nginx的时候确实是挂载的这个目录###############
# 这个是本地windows了,将本地的证书文件上传到服务器
scp www-snowball-fans-nginx-1201223021.zip root@ddf:/opt/nginx/conf/cert
# 再次登录到服务器进行操作
ssh ddf
cd /opt/nginx/conf/cert
# 解压zip
unzip www-snowball-fans-nginx-1201223021.zip
配置nginx部分,参考了阿里云的帮助文档虽然证书不是他的,但配置是相通的呀
这里前提一定要是域名是备案过的,如果购买域名和域名解析以及https配置都挤在一块的话, 这里部署会报错的, 除非把ssl的端口先换成非443的, 然后是可以带端口https访问的。
下面这几篇文章一定要读, 因为下面给出的配置并不一定适合自己的网站, 下面的文章会去解释这一块安全性和兼容性之间的问题
关于加密套件的选择 https://blog.myssl.com/https-security-compatibility-best-practices/#a
https://blog.myssl.com/pci-dss/
https://blog.myssl.com/ssl-and-tls-deployment-best-practices/
user nginx;
worker_processes 4;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
charset utf-8;
gzip on;
include /etc/nginx/mime.types;
default_type application/octet-stream;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
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_set_header Server_Addr $server_addr;
proxy_set_header Server_Name $server_name;
# 项目如果支持websocket 需要在下面的location下配置请求头
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
# include /etc/nginx/conf.d/*.conf;
server {
listen 443 ssl;
listen 80;
# 将www.certificatestests.com修改为您证书绑定的域名,例如:www.example.com。如果您购买的是通配符域名证书,要修改为通配符域名,例如:*.aliyun.com。
server_name www.snowball.fans;
ssl_certificate /etc/nginx/cert/www.snowball.fans_chain.crt; #将domain name.pem替换成您证书的文件名称。
ssl_certificate_key /etc/nginx/cert/www.snowball.fans_key.key; # 将domain name.key替换成您证书的密钥文件名称。
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
ssl_protocols TLSv1.1 TLSv1.2; #使用该协议进行配置。
ssl_prefer_server_ciphers on;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
root /usr/share/nginx/html;
index index.html;
}
}
}
注意下图的这个错,首先要排除是不是自己的域名还未备案,未备案的话默认这个443端口是无法访问的
测试时先用别的端口
下面就安心等待域名备案成功吧
使用https://myssl.com 来测试网站的https安全级别,当然需要知道的是安全级别和兼容性之间是需要有取舍的
可以看到安全级别是很高的,且更严格的PCI DSS标准也合归
但是往下看就能可看到了,兼容性是很差的,握手失败的,都是无法兼容使用https的
总结,关于安全性和兼容性在前面加密套件选择给出的原文链接已经说的很详细了,自己去选择就行了,至此安装结束