docker+nginx+wordpress リバースプロキシにてはまった件
Dockerにて、
1) リバースプロキシ用nginxのコンテナ
2) wordpress+nginx用コンテナ
を作り、1から2に転送をしたところ、urlのドメイン名またはIPアドレスにPort番号が付加されて表示された。
やりたいこと「http://xxx.xxx.xxx.xxx」にアクセスしたら、url欄には、
こう表示したい→:http://xxx.xxx.xxx.xxx
しかしこのようになる→:http://xxx.xxx.xxx.xxx:39000
nginx.conf(正確にはnginx.confにincludeされるconf.d内のファイル)には以下のように設定した。
server {
server_name _;
listen 80;
port_in_redirect off;
proxy_redirect off;
access_log /var/log/nginx/access.log main;
location / {
port_in_redirect off;
proxy_set_header Host $http_host;
proxy_pass http://172.17.0.9:80;
}
}
「port_in_redirect off;」を入れたらportは表示されないはず(?理解まちがってるかも)。
また、転送元も転送先もwellknownポートの80番。80番はurlに表示されないはず。
しかし、「http://xxx.xxx.xxx.xxx:39000」のように表示された。
port 39000はdockerコンテナ起動時、container側80番ポートに割り当てたhostOS側ipアドレスのportだった。(設定コマンド例:docker run --name nginxcontainer -d -p 39000:80 -t nginx )
「docker ps」でPORT欄には「0.0.0.0:39000->80/tcp」のように表示されていた。
この転送設定がいけないのかと思い、一旦containerをcommitし停止、別containerとして再起動し、その際port転送設定は外した。(PORT欄には「80/tcp」とだけ表示される。)
このように設定したあと、url「http://xxx.xxx.xxx.xxx」に再度アクセスすると、urlは「http://xxx.xxx.xxx.xxx:39000」と表示され、さらにサイトが表示できなくなった。
# 原因 ・・・ wordpressがリダイレクトしていた
wordpressインストール時、wordpressはinstall時のurlをsite address, wordpress addressとする。そのため、あとでアクセス経路を変えても、最初のport番号にredirectしてしまう。
当初はnginxのリバースプロキシをせず、nginx-wordpressのcontainerに直接外部ポートを割り当てていた。この際、外部向けのportにはあえて80番は使用せず開けておいた。
構成1
browser —> 39000=80(nginx-wordpress-container)
この状態では39000からしかクセスできない。表示も当然 「http://xxx.xxx.xxx.xxx:390000」となる。
この状態でwordpressインストールを行い、wordpressのhello worldページが表示されることを確認した。
あとからproxy用のnginxを設定した。
構成2
browser —> 80=80(nginx-proxy) ==> 80(nginx-wordpress-container)
—> 39000—————————————————|
このときは、39000に直接アクセスできるし、80番(=ポート番号省略)でもアクセスできた。
ただし、80番でアクセスしても、39000にリダイレクトされていた。
構成3
browser —> 80=80(nginx-proxy) ==> 80(nginx-wordpress-container)
39000とwordpressのコンテナ80番の転送を削除してもリダイレクトは解消されず、画面は表示されなくなった。
このときの動きとしては、wordpressが一旦nginx-proxy経由で80portで受付、すぐに39000portのredirectパスをhttp:301としてbrowserに返却していた。
# wordpress修正箇所
※port転送削除のやり方としては、containerを一旦commitして差分imageを作成し、あらためて新しいcontainerで再起動すれば良いだけだが、なかなか問題が解決しなかったので、別の方法--「iptables」を使う方法も調べた。こちらを使うのが本来ネットワーク設定としては本道である。
iptablesの設定を一覧する。
・nat設定をリストする
iptables -t nat -n -L --line-number
・filter設定をリストする
iptables -t filter -n -L --line-number
iptables-save 設定コマンド形式でiptable設定を取得する。nat,filter設定両方取得できるので
便利。
DOCKER RUNの-pで設定した転送設定は、
iptables側では
*nat Chain DOCKER 設定 target DNATとして設定されているので、ここを削除してやってもよいはず。
削除コマンド
iptables -t nat -D DOCKER <num>
DOCKERのipアドレス取得
全containerがつかってるipアドレス全部取得
docker network inspect bridge
特定のcontainerがつかってるipadress
docker inspect <conrainer> | grep Address
-----------------
調査リンク
# Docker
[★nginxでロードバランサからlocal:8080とかにふった先で rewire redirectしたときにport番号を引き継がない方法](http://hiroyukim.hatenablog.jp/entry/2012/03/14/115828)
[dockerで後からポートを公開する](http://qiita.com/arimakouyou/items/506416a679f0f94ff9f1)
[★Dockerのネットワークの基礎](http://deeeet.com/writing/2014/05/11/docker-network/)
[★stackoverflow : Remove port binding from an existing docker container](http://stackoverflow.com/questions/27549509/remove-port-binding-from-an-existing-docker-container)
[※コンテナの働き - Docker User Guide](http://qiita.com/zembutsu/items/c6a5070480c98ca000f7)
Dockerの基本的な動きについての説明
# iptablesコマンド関連
[RHEL4 ref/ iptablesコマンドで使用するオプション](http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-ja-4/s1-iptables-options.html)
[iptablesのルールをひとつ削除](http://www.mycurse.net/linux%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0/iptables%E3%81%A7%E3%83%AB%E3%83%BC%E3%83%AB%E3%82%92%E3%81%B2%E3%81%A8%E3%81%A4%E5%89%8A%E9%99%A4/)
[iptablesの設定](http://www.nina.jp/server/redhat/iptables/iptables.html)
[Ubuntuでiptablesの設定をiptables-persistentで永続化する](http://iwashi.co/2015/01/16/ubuntu-iptables-persistent/)
iptables-save > rule.txt
iptables-restore < rule.txt
[man IPTABLES](http://linuxjm.osdn.jp/html/iptables/man8/iptables.8.html)
# nginx
[nginx連載4回目: nginxの設定、その2 - バーチャルサーバの設定](http://heartbeats.jp/hbblog/2012/04/nginx04.html)
# WordPress
[WordPressでRedirectionプラグインを使いURLをリダイレクトさせる方法](http://whitehatseo.jp/how-to-301-302-redirection-wordpress/)
----
# あとで参考にするかも
[(ubuntu12.04)nginxでwordpressを動かす](http://smokycat.info/nginx/478)
コメント
コメントを投稿