1.在dockerhub上查询是否有自己需要的nginx版本
#docker search nginx
2.拉取仓库nginx镜像,不加版本号默认拉取最新的版本
#docker pull nginx
3.启动nginx容器
# docker run --detach \
--name wx-nginx \
-p 443:443\
-p 80:80 \
-v /home/evan/workspace/wxserver/nginx/data:/usr/share/nginx/html:rw\
-v /home/evan/workspace/wxserver/nginx/config/:/etc/nginx//:rw\
-v /home/evan/workspace/wxserver/nginx/config//:/etc/nginx//:rw\
-v /home/evan/workspace/wxserver/nginx/logs:/var/log/nginx/:rw\
-v /home/evan/workspace/wxserver/nginx/ssl:/ssl/:rw\
-d nginx
备注运行上述命令后可能或报错:Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type. 因为宿主机如果nginx配置文件与容器nginx不一致无法挂载,上述命令的/home/evan/workspace/wxserver/nginx/config/,/home/evan/workspace/wxserver/nginx/config//中的,在该路径下是文件夹不能与容器内部文件形成映射;
解决:到宿主机上/home/evan/workspace/wxserver/nginx/config/删除文件夹,创建对应的文件,到宿主机/home/evan/workspace/wxserver/nginx/config//下删除文件夹,创建文件,这是刚刚启动的容器没有启动成功可以先删除刚刚没有启动成功的nginx容器,
1).查询所有容器 #docker ps -a
2) 删除刚刚没启动成功的nginx容器 # docker rm 你的nginx容器ID
3)重新执行
# docker run --detach \
--name wx-nginx \
-p 443:443\
-p 80:80 \
-v /home/evan/workspace/wxserver/nginx/data:/usr/share/nginx/html:rw\
-v /home/evan/workspace/wxserver/nginx/config/:/etc/nginx//:rw\
-v /home/evan/workspace/wxserver/nginx/config//:/etc/nginx//:rw\
-v /home/evan/workspace/wxserver/nginx/logs:/var/log/nginx/:rw\
-v /home/evan/workspace/wxserver/nginx/ssl:/ssl/:rw\
-d nginx
4.文件准备
- nginx的默认首页html的存放目录映射到host盘的目录, /home/evan/workspace/wxserver/nginx/data
- nginx的配置文件映射到host盘的文件,/home/evan/workspace/wxserver/nginx/config/
1)在上述/home/evan/workspace/wxserver/nginx/config/夹下自己创建的添加默认配置
#运行nginx的用户
user nginx;
#启动进程设置成和CPU数量相等
worker_processes 1;
#全局错误日志及PID文件的位置
error_log /var/log/nginx/ warn;
pid /var/run/;
#工作模式及连接数上限
events {
#单个后台work进程最大并发数设置为1024
worker_connections 1024;
}
http {
#设定mime类型
include /etc/nginx/;
default_type application/octet-stream;
#设定日志格式
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/ main;
sendfile on;
#tcp_nopush on;
#设置连接超时的事件
keepalive_timeout 65;
#开启GZIP压缩
#gzip on;
include /etc/nginx//*.conf;
}
2)在上述/home/evan/workspace/wxserver/nginx/config//夹下自己创建的添加默认配置
server {
listen 80; #侦听80端口,如果强制所有的访问都必须是HTTPs的,这行需要注销掉
server_name ; #域名
charset utf-8;
#access_log /var/log/nginx/ main;
# 定义首页索引目录和名称
location / {
root /usr/share/nginx/html;
index ;
}
#定义错误提示页面
#error_page 404 /;
#重定向错误页面到 /
error_page 500 502 503 504 /;
location = / {
root /usr/share/nginx/html;
}
}
3) 在/home/evan/workspace/wxserver/nginx/data:/usr/share/nginx/html/文件夹下随便创建一个文件,任意的都可以。
这个时候直接通过IP地址就可以访问nginx定义的这个html文件了。但是这个时候的访问只是http的,https的访问还是不行的,需要添加证书到nginx服务器。
----------------------------------------------------------------------------------------------------------
5.通过openssl生成证书配置https
进入上述路径/home/evan/workspace/wxserver/nginx/ssl/ 文件夹下执行如下操作:
1)设置,这里需要设置两遍密码:
#openssl genrsa -des3 -out 1024
2)参数设置,首先这里需要输入之前设置的密码,然后需要输入如下的信息,大概填一下就可以了,反正是测试用的:
#openssl req -new -key -out
3) 写RSA秘钥(这里也要求输入之前设置的密码):
#openssl rsa -in -out server_nopwd.key
4)获取私钥:
#openssl x509 -req -days 365 -in -signkey server_nopwd.key -out
完成这一步之后就得到了我们需要的证书文件和私钥了
6 .添加配置nginx ssl配置
1)修改/home/evan/workspace/wxserver/nginx/config//文件夹下的配置文件
server {
listen 80; #侦听80端口,如果强制所有的访问都必须是HTTPs的,这行需要注销掉
listen 443 ssl;
server_name ; #域名
# 增加ssl
#ssl on; #如果强制HTTPs访问,这行要打开
ssl_certificate /ssl/;
ssl_certificate_key /ssl/server_nopwd.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
# 指定密码为openssl支持的格式
ssl_protocols SSLv2 SSLv3 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5; # 密码加密方式
ssl_prefer_server_ciphers on; # 依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
# 定义首页索引目录和名称
location / {
root /usr/share/nginx/html;
index ;
}
#重定向错误页面到 /
error_page 500 502 503 504 /;
location = / {
root /usr/share/nginx/html;
}
}
重启nginx容器,现在就可以通过https:// ip 来访问nginx的服务器了
备注:如果出现EM_do_header:bad password read error:140B0009:SSL 错误,因为nginx
启动的时候需要输入证书密码,解决办法是可以使用私钥来生成解密后的key
来代替,效果是一样的(就跟ssh
连接差不多),达到免密码重启的效果,在上述配置中
server_nopwd.key就是解密的key,就是加密的key,刚刚我配置的就是解密的key.
附录:nginx的负载均衡配置:
,由于证书是属于自签发的所以浏览器不承认(不认识)会弹出不安全的链接提示,所以正式上线需要申请正规的证书,在当前情况下线设置浏览器忽略该提示,然后 浏览器会请求时会发送预检机制发送OPTIONS请求,去判断是否是成功安全的,nginx对应的配置如下
upstream hsdfas {
#least_conn; #least_conn请求分配到连接数最少的server;ip_hash按照访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一server进行处理;
#server 192.168.1.79:8092 weight=1 max_fails=3; #down表示单前的server暂时不参与负载,非backup机器down或者忙的时候,请求backup机器
}
server{
listen 80; #侦听80端口,如果强制所有的访问都必须是HTTPs的,这行需要注销掉
listen 443 ssl;
server_name 192.168.1.79;
#开启 如果把ssl on;这行去掉,ssl写在443端口后面。这样http和https的链接都可以用
#ssl on; #如果强制HTTPs访问,这行要打开
ssl_certificate /ssl/;
ssl_certificate_key /ssl/hsdfas_unsecure.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
# 指定密码为openssl支持的格式
ssl_protocols SSLv2 SSLv3 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5; # 密码加密方式
ssl_prefer_server_ciphers on; # 依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
location / {
proxy_pass http://hsdfas;
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 X-Forwarded-Proto https;
proxy_ignore_client_abort on;
// 排除浏览器的预检机制
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Headers Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS,HEAD,PUT;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Headers X-Data-Type,X-Auth-Token;
return 204;
}
client_max_body_size 16m;
client_body_buffer_size 512k;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffer_size 512k;
proxy_buffers 16 512k;
proxy_busy_buffers_size 1024k;
proxy_temp_file_write_size 1024k;
add_header Access-Control-Allow-Origin *;
index ;
}
#重定向错误页面到 /
error_page 500 502 503 504 /;
location = / {
root /usr/share/nginx/html;
}
}