チャットを作りたい
やり方は色んなのがあるみたいで、調べた中ではポーリングとかWebSocketとかがあった。で、WebSocketが良さげな感じがした。WebSocketの実装するにあたってどれがいいかなーと思って、例えばWikipedia見ると
サーバー欄に色々書いてる。あとは「チャット 開発」とかでググったりすると色んなのが出てくる。その中でNode.jsっていうのがよさそうだったのでそれ使ってみたい。
なんだけど、Node.jsでアプリ作って実行すると、ターミナルが実行中のままになってCtrl+Cするまでずっとコマンド打てない感じになる。今このブログが置いてあるサーバーはCentOS+ApacheなんだけどApacheはそんなことない。起動したら裏で動いててくれて、ターミナルで他のことができる。そういう感じにしたい。できるのかなーと、どういう仕組なんだろうなーと、調べるとサービスとかデーモン化とかすると裏で動く感じになるみたい。Node.jsにはそれ用のライブラリがあって、foreverっていうらしい。それ使えばできそう。
あと、ApacheもNode.jsもサーバーの機能が被ることになる。競合して変ななりそうな気がする。かといって練習のためだけにまた新しく費用かけてインスタンス建てるのもなーと考えてた。これも調べていくとリバースプロキシっていうのがあって、リクエスト先によって、ApacheとNode.jsのどっちで処理するか振り分けるみたいなことができるらしい。でも難しそう・・・。で、リバースプロキシが得意なサーバーがあって、nginxという。nginxとApacheもリバースプロキシを使って共存ができるみたいで、Node.jsとも共存ができるらしい。ほほう。つまりReq→Nginx→Apache or Node.js(forever)っていう感じになれば、1つのサーバーで完結できそう。できるんですか?
頭の中ではこんな感じなのだが、じゃあこれをやれるのかと。とりあえずやってみよう。失敗したらブログも消えてさよならですね。
ブログのバックアップを取る
ブログ消えるのヤなので、バックアップをとっとく。
時々このプラグインでバックアップを取っている。色んな更新が溜まってたので、それも適用してからローカルにダウンロードしといた。これで最悪全部ぶち消えても大丈夫だ。大丈夫だよね?
NginxとApacheを共存させる
などのいろんな記事を参考に、Nginxをインストールして設定してく。
準備
cloudflareを一時停止する
ResponceHeaderがcloudflareになってるのが
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.3.4になった。
Apacheを止める
$ systemctl stop httpd
で止まる。
Apacheのポート番号を変更
/etc/httpd/conf/httpd.confへ行き
Listen 80 を Listen 8080
に変更。この番号は使ってないやつだったら何でもいいみたい。SSLはLet’s encryptを使ってるけどやり方がわからん。
https://t-tel.net/ssl/ssl061/
を見て
/etc/httpd/conf/httpd.confに
Listen 8443
を追記。
これダメだった。
/etc/httpd/conf/httpd-le-ssl.confの
<VirtualHost *:443>
を
<VirtualHost *:8443>
に変更した。
$ service httpd configtest
てすると
Syntax OK
は出る。で、試しに
$ systemctl start httpd
でサイトにアクセスしてみるとプライバシエラー。ただまぁ無視して突き進むと表示できた。(保護されていない通信って赤字は出る。)
うーむ、ちょっとよく分かんないのでとりあえず突き進もう。
$ systemctl stop httpd
でApache止める。
nginxインストール
普通にインストールしようとすると古いバージョンが入ってしまうそうなので、リポジトリを追加する。
/etc/yum.repos.d/に行って
$ vi nginx.repo
とか。でCentOS7.4なので
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1
こう。んで保存。そしたら
$ yum install nginx
確認。
$ nginx -V nginx version: nginx/1.18.0
大丈夫そう。
$ systemctl start nginx
起動。
$ systemctl status nginx
チェック。
Active: active (running)
うむ。そんで
!http://dalomo.net/に行くと
表示された!けど
!https://dalomo.net/だと表示されない。。。まぁおっけおっけー。一応
$ systemctl enable nginx
で自動起動されるようにしとく。
$ systemctl restart httpd
でApache再起動。
nginxの設定ファイルを編集する
/etc/nginx/conf.d/に行って、default.confはリネームしちゃう。
$ mv default.conf default.conf.bak
そんで新たにファイル作る
$ vi reverse_proxy.conf
設定ファイルの書き方がいまいちわかんないなぁ、まず
server { listen 80; server_name localhost; location / { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
だけ書いて保存。んでnginxを再起動
$ systemctl restart nginx
そしたら502 Bad Gatewayになる。。。うーん?
ここでちょっと席外してたらいつの間にかアクセスできるようになってた。なんだったんだろ。ただそれでもプライバシエラーは出るし、ResponceHeaderはApacheのままだ。ちょっとnginxのlogを見てみると
connect() to 127.0.0.1:8080 failed (13: Permission denied) while connecting to upstream
ってエラーが出てた。
を参考に
$ setsebool httpd_can_network_connect on -P
と打ったらエラーは出なくなった。でもサイトにアクセスしても特に変わりがない・・・。証明書がなんか変になってんのかなーと思った。まずはポート443の設定も追記してみる。
server { listen 443; ssl on; ssl_certificate /etc/letsencrypt/live/dalomo.net/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/dalomo.net/privkey.pem; server_name localhost; location / { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
で
the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in
て出たので
で
listen 443 ssl; ssl on; #削除
した。
ちゃんと表示されるように頑張る
なんやかんやあってApacheが再起動できなくなった。調べてくと上で編集した
/etc/httpd/conf/httpd.confに
Listen 8443
じゃなくて、/etc/httpd/conf.d/ssl.confを編集するべきだったみたい。
上の追記を削除して
こちら参考に
Listen 443 https → Listen 8443 https <VirtualHost _default_:443> → <VirtualHost _default_:8443>
こう変えたら起動した。ポート443がnginxと被ってたってわけだ。そんでアクセスしてみると
dalomo.net でリダイレクトが繰り返し行われました。 ERR_TOO_MANY_REDIRECTS
になった。これも上記ページを参考に
RewriteEngine on RewriteCond %{SERVER_NAME} =dalomo.net [OR] RewriteCond %{SERVER_NAME} =dalomo RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
にしてたのをすべてコメントアウト。そしたら再起動を忘れずに
$ systemctl restart httpd $ systemctl restart nginx
したらちゃんと表示された。
おー!ちゃんと表示されたわ!
ちゃんとnginxになってる!長かったぜ~
コメント