KazumaLab.

流行りとリラックマと嵐が大好きです。

VM上のNginxからProxypassでMac上で起動しているRailsを動かすお話

かずまです。

お久しぶりです。
社会人になってはや3ヶ月、元気にやっております。
Rubyのエンジニアとしてどうにか勉強中です。


さて、今日はネットワークネタになります。
Ansibleを使ってVagrant上にNginxを起動し、ローカル環境のMacで動いているRailsを動かしてみようというお話です。
その時に詰まったのでメモしておきます。

Vagrant

www.vagrantup.com

簡単にMac上にVMを建てられます。
AnsibleやChef、Itamaeを使うと環境構築が一発にできます。

今回はCentos7を使って行きます。
Vagrant Fileにprivate ipをお忘れなく。

www.vagrantup.com
ちなみに、外からも見えるようにしたい場合はpublicを使うと良さそうです。

Nginx

静的なページを表示したりするWebサーバー。
RailsとかNodeJSはアプリケーションサーバーです。

今回の構造

f:id:kazumalab:20170628222948p:plain

あるPCからNginxのIPアドレスでアクセスして、それをNginxが受けて、Rails側にリクエストを送るという構造。
このボックス一つは一つのサーバーになっています。

ただし、今回は面倒なので、リクエストの送る先と受ける先を同じにするということです。

Nginxの設定

今回はインストールなどの導入は省きます。
Ansibleを使う場合は一度手動でサーバー構築してからやるほうが良さそうです。

とりあえず今回はdefault.confをいじることにします。
アクセスしたものをプロキシーパスでローカル環境のMacを指し示しているわけですね。

# on VM Terminal
# vim /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    access_log  /var/log/nginx/log/host.access.log  main;
    error_log   /var/log/nginx/log/host.error.log;

    location / {
        # rails ip address in other server
        proxy_pass http://192.168.0.2:3000;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

一応、ミニマムな感じで書きました。
実際に運用する場合はヘッダーに色々記述する必要があると思いますので。

後はログは出力する設定にしたので、もしディレクトリがなければ生成してください。
権限はrootでも大丈夫なはずです。書き込み権限だけは与えてください。

proxy_passに自分のローカル環境のip + Railsを立ち上げたポートを記述しておきます。

Railsを立ち上げる

# on Mac Terminal
$ rails s -b 0.0.0.0

これで同じネットワーク内であればIPでアクセスが可能です。
一応、Macのip+ポート番号でアクセスできるか確認して、VM側でもCurlとかして確認すると良さそうです。
Headerのみ返す場合は

# on VM Terminal
$ curl --head http://192.168.0.2:3000

多分こんな感じだったはず。

アクセス時にPermissionがないといわれる

これでNginxを再起動してIPでアクセスしたところ、一応反応はあるけど502が返ってくるようになりました。
先程設定したログを見てみるとパーミッションでコケているらしいです。

# on VM Terminal
failed (13: Permission denied) while 
connecting to upstream, client: 192.168.0.2, server: localhost, request: "GET / HTTP/1.1", upstream:

ぐぐってみたところ似たような問題が!

stackoverflow.com

SELinuxがだめっていっているそうですね。
まぁそもそも違うサーバーにプロキシーで飛ばすのおかしいよというお話だと思いますが、とりあえず、動かすことが目的なので、
SELinuxをDisableにしてみます。
もちろんSELinuxにProxypassを有効にしてあげればいいのですが、その前にまず原因がSELinuxなのかを判別したかったのでとりあえずオフにしました。

# on VM Terminal
$ setenforce 0

これでNginxを介して、ローカルのRailsを動かすことに成功しました。

参考URLに書いてある感じで、止めるのではなくSELinuxの設定をすると良さそう。
以上です。