驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
Docker安装Nginx小记
/    

Docker安装Nginx小记

前言

最近好好的学习了docker,想把个人网站的nginx替换为docker部署,在学习的过程中,摸爬打滚了一番,这里简单做一个记录。

docker安装nginx

 docker run -p 80:80 -p 443:443 -m 200m --restart always --name nginx \
 -v /Users/alistar/docker-data/nginx/www:/www \
 -v /Users/alistar/docker-data/nginx/conf/:/etc/nginx/ \
 -v /Users/alistar/docker-data/nginx/logs:/var/log/nginx/logs \
 -v /Users/alistar/docker-data/nginx/run:/var/run \
 -v /Users/alistar/docker-data/nginx/wwwlogs:/wwwlogs \
 --add-host=dockerhost:`docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' bridge` \
 nginx
  • 我是Mac系统,在个人目录alistar目录创建了一个目录docker-data作为外部映射。所以-v就是目录的映射。
  • --add-host=xxx 是为了放docker 容器能够访问宿主机网络而设置的。默认情况下docker的是无法访问宿主机的
  • -m 200m是限制了docker中nginx最大能使用200m的内存。
  • --restart always表示每次docker启动后,nginx就自动重启。
  • 其中443端口是为了https 添加的(2019年04月17日 修改)

问题1:缺少配置文件

执行该命令后,通过

  • docker ps
  • docker logs nginx

会发现nginx没有正常启动,通过logs指令可以看出,是因为配置文件不全的缘故,默认是没有将配置文件打包的。

可以在配置的-v /Users/alistar/docker-data/nginx/conf/:/etc/nginx/的第一个目录/Users/alistar/docker-data/nginx/conf下添加配置文件,大概需要添加2类

nginx.conf

核心的配置,这里我把练手的配置放在这里,仅供参考。

user nginx;
worker_processes 1;
error_log /var/log/nginx/logs/error.log warn;
pid /var/run/nginx.pid;
events {
    worker_connections 1024;
}
http {
    include /etc/nginx/mime.types;
    include /etc/nginx/conf.d/*.conf;
    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/logs/access.log  main;
    sendfile on;
    keepalive_timeout 65;
#51mybaby
    server {
        listen 80;
#此处一定要加www,否则会匹配到下面去
        server_name www.51mybaby.com;
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
        proxy_set_header Host $host;
        proxy_set_header X-http_x_forwarded_for $remote_addr;
        location / {
            root /www/51mybaby;
            index index.html;
        }
    }
# uewell
    server {
        listen 80;
        server_name www.uewell.com;
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
        proxy_set_header Host $host;
        proxy_set_header X-http_x_forwarded_for $remote_addr;
        location / {
            root /www/uewell;
            index index.html;
        }
    }
    #www.aaa.com,动态负载均衡
    upstream backend {
        #此处必须是局域网ip
        server 192.168.0.5:8899 weight=2;
        server 192.168.0.5:8898 weight=1;
    }
    
    server {
        listen 80;
        server_name www.aaa.com;
        location / {
            proxy_pass http://backend;
        }
    }
}

mime.types

这个不是关键,所以就不罗列出来了,可以参考Nginx官方的文档:点我有惊喜噢

问题2:如何执行nginx的指令

nginx常用指令地址:言简意赅的链接

现在通过docker如何执行了?

关键就是通过exec命令进行执行。

 docker exec nginx-container-name nginx -t
 docker exec nginx-container-name nginx -s reload
 docker exec nginx-container-name nginx -v 

问题3:nginx报错502

查看error.log日志可以发现更为详细的错误

2019/04/15 09:18:38 [error] 7#7: *1 no live upstreams while connecting to upstream, client: 172.17.0.1, server: www.aaa.com, request: "GET / HTTP/1.1", upstream: "http://backend/", host: "www.aaa.com"

就是说配置的主机都ping不通,在我电脑上的原因是,我的nginxdocker中,应用在宿主机直接部署,所以保此错误。

经过百度,可以通过如下方式进行处理,在run的时候添加hosts,代码如下所示:

 --add-host=dockerhost:`docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' bridge`

这样可以多加一个hosts,此时通过宿主机的ip地址就可以访问了。

问题4:如何本地模拟

通过hosts进行本地映射

  • Windows系统中hosts的位置是:C:\Windows\System32\drivers\etc
  • Linux系统中hosts的位置是:/etc/hosts

不管是哪个系统,修改都需要管理员权限,此处请注意了,我这里为了结合这次的测试,是这样配置的

...省略...
# 主要看这里
127.0.0.1 www.uewell.com
127.0.0.1 www.51mybaby.com
127.0.0.1 www.aaa.com

为什么修改hosts就能通过域名来访问了,这是一道很经典的面试...

6点,收拾东西,准备下班, 回去继续好好学习docker