Docker 安装 Nginx 小记

本贴最后更新于 2029 天前,其中的信息可能已经天翻地覆

前言

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

docker 安装 nginx

 docker run -p 80:80 -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 就自动重启。

问题 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

  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    490 引用 • 916 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...