"前言 最近好好的学习了docker,想把个人网站的nginx替换为docker部署,在学习的过程中,摸爬打滚了一番,这里简单做一个记录。 docker 安装 nginx docker run -p 80:80 -m 200m --restart always --name nginx \ -v /Users/alist .."

Docker 安装 Nginx 小记

前言

最近好好的学习了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

问题 1: 缺少配置文件

执行该命令后,通过

会发现 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进行本地映射

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

...省略...
# 主要看这里
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 日。

    194 引用 • 411 回帖 • 730 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销, 可以很容易地在机器和数据中心中运行。最重要的是, 他们不依赖于任何语言、框架或包括系统。

    165 引用 • 309 回帖 • 736 关注
感谢    关注    收藏    赞同    反对    举报    分享
回帖    
请输入回帖内容...