Perlがくしゅう帳(Rubyも)

プログラミングの勉強会の参加記録や学んだことなど。 twitter ID : @tomcha_で活動しています。 最近は主にPerl関連の勉強会やコミュニティに参加しています。移転前のブログはこちら->http://ruby.doorblog.jp/

さくらVPS+CentOS7で、独自ドメインのウェブサイトを公開するまでの道のり

SakuraVPSで独自ドメイン運用しているwebサイト、CentOS6からCentOS7に再インストールしてからずっと放置していたので、作業したこと、詰まったことメモ。

やりたい事は、

  1. http://tomcha.net へのアクセスで、独自サイトを表示。
  2. 独自サイトはSinatra + Passenger で動かす。
  3. httpsも出来るように、証明書を設置。証明書はLet's Encryptを使う。
  4. ポートフォワード(前回はiptables,今回はfirewalledを使用)以外に、nginx にもちょっと手を出してみる。

やったこと手順

sinatra + passenger でwebアプリを実行

bundle exec passenger start -p 80 -d

な、なんといきなりエラーががが。どうもポート80で起動すると怒られる。
色々ググってみると、CentOS7では、1024より若いポートで何かするにはroot権限が必要みたい&&怒られる様。

ポート80が駄目だったので、任意のポート(記事の例は5000番)で実行して80番へのアクセスから飛ばす作戦。

bundle exec passenger start -p 5000 -d

80番ポートと443番ポートで外からアクセス出来るように設定。

# 開いてるPublicゾーンのポートの確認
firewall-cmd --list-ports --zone=public
# ポートを開ける
firewall-cmd --add-port=80/tcp --zone=public --permanent
firewall-cmd --add-port=443/tcp --zone=public --permanent
# 設定を有効化
firewall-cmd --reload

80番ポートへのアクセスを5000番ポートに投げる設定。CentOS7から使われているfirewalledを使った設定。

# public ゾーンのポートフォワードを確認
firewall-cmd --zone=public --list-forward-ports
#public ゾーンで TCP80,443の通信をTCP:5000へ投げる設定
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=5000
firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=5000

firewalledのポートフォワードでの転送ではなく、nginxのリバースプロキシで制御する方法

  • nginxのステータス確認方法
sudo service nginx status
  • nginxのリバースプロキシの設定
    • /etc/nginx/nginx.conf をsudoで編集
server{
    listen 80;
    server_name  tomcha.net;

    location \ {
        proxy_set_header Host $http_host;
        proxy_pass http://localhost:5000;
    }
}
  • nginxのリスタート等コマンド
sudo service nginx start
sudo service nginx stop
sudo service nginx restart

nginxのリバースプロキシを使った場合、これで設定はOKなはずなのに、サイトにアクセスするとnginxのエラーページが表示される。
なので、nginxのログを調べてみた。

sudo ls -la /var/log/nginx/
  # -> error.logってファイルが存在することがわかる。
sudo cat /var/log/nginx/error.log
  # -> connect() to 127.0.0.1:5000 failed (13: Permission denied)が出まくる。

どうもパーミッションの関係で5000番ポートへの接続ができていない。色々ググッてみたところ、SELinuxのセキュリティで引っ掛かってるみたい。
この辺から、かなり手に負えない感じなので、色々参考にさせてもらったサイトはこちら。

CentOS7.1 64bit SELinuxによるアクセス制御 | kakiro-web カキローウェブ

SELinuxが妨害してるのか、一度SELinuxを無効化して確認してみる。

getenforce
  # -> 現在有効か無効か確認

# 無効化してみる
sudo setenforce Permissive

SELinuxを無効化すると、ちゃんとSinatraで作ったwebアプリが表示された。ということは、こいつが邪魔をしている模様。
ググッてみて、同じ状況の対策が書かれている記事を発見。同じようにやってみる。

qiita.com

www.crystalsnowman.com

# SELinuxをもう一度有効化。
sudo setenforce Enforcing
  # -> 予想通り繋がらなくなった。

# SELinuxの状態を表示するツールsesearchを実行したが、コマンドが見当たらず。ツールをインストール。
sudo yum install setools-console

# SELinuxの状態を表示させる。オプションはコピペした
sesearch -A -C -s httpd_t -t http_cache_port_t -c tcp_socket

# httpd_can_network_relayのbool値を変更。(拒否DTをはずす)
sudo setsebool -P httpd_can_network_relay=1
  # -> 元に戻す時は httpd_can_network_relay=0 に。



繋がったーーーー