macから疎通できない…
nginx: nginx:1.10.2-alpine
(Official)
vagrant: centos7.0-tommy-muehle
macでcurl 192.168.33.xx:8080
としてもdocker logs -f docker_nginx_1
にアクセスログすら流れない。しかしvm上で curl localhost:8080
とするとちゃんと返ってくる
考えたこと1
[vagrant or mac] port forwardingがうまくいっていない
→ (centos)netstat -tanp | grep LISTEN
→(mac)lsof -i -P | grep "LISTEN"
http://qiita.com/RyujiKawazoe/items/e45d1c5bf9892123d00f
問題なし
考えたこと2
[docker] docker-compose.ymlの設定が誤っている
nginx:
image: nginx:1.10.2-alpine
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/mynginx.cnf:/etc/nginx/conf.d/mysite.template
ports:
- "8080:80"
environment:
- NGINX_HOST=127.0.0.1
- NGINX_PORT=80
.....
command: /bin/sh -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
「公式からコピペしてきたしそんな変な設定してないっしょ」と思い軽く流し読み。(この思い込みが良くなかった…)
考えたこと3
[docker] nginx.confが誤っている
upstream backend {
server ${NGINX_HOST_SERVER}:1337;
}
server {
listen ${NGINX_PORT};
server_name ${NGINX_HOST};
location ~ .*\.(jpg|gif|png|css|js|inc|ico) {
expires 30d;
root ${NGINX_WEB_ROOT};
}
location / {
add_header Access-Control-Allow-Origin '*';
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header Access-Control-Allow-Credentials true;
expires modified +10m;
proxy_pass http://backend;
break;
}
}
これもざっと見(他のPJで使用していて実績があったため)OKっぽい
考えたこと4
[vagrant] firewalldが動いている
OFFにしたよなぁと思いつつ念のため見返すも、やはり動いてない
考えたこと5
[vagrant] 消滅したはずのiptablesが何か悪さをしている
動いてない
そして正解へ
CentOS7 (vagrant) に docker をインストールして nginx で hello world するまで
を見つけ、この通りに実行するとすんなりmacからtelnetが通るではないか。
(sudo sysctl -w net.ipv4.ip_forward=1
をvagrant上で実行する必要はあったが)
これはいよいよ、nginx.confくらいしか違いがないぞということで見直すと…
server_name ${NGINX_HOST};
が間違ってただけ(白目)
nginxは HTTP リクエストに対して、最初にどのサーバでそれを処理すべきか を決定します。その際に用いられるのが、リクエストヘッダ中の Host フィールド です。以下の例では、このHost フィールドと server_name が一致した 場合、該当するサーバ設定が採用されます。
誤:server_name 127.0.0.1;
正:server_name _;
or server_name 192.168.33.xx;
(何にもマッチしないと最初のserverディレクティブが使われるので。あるいはVagrantfileのprivate_network
で設定したIPでも良い)
おわりに
めっちゃはまった...
(追記)19:59
vagrant:~ $ sudo sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
なんかこいつが重要な気がしてきた…
これが無効だとそもそも疎通できない?(要調査)