Memo plus Alpha

メモにプラスアルファを加えて価値ある情報に。

さくらVPSで複数のサブドメインをSSL化する(HTTPS接続)

はじめに

さくらVPSでサイトをSSL化(HTTPS化)したときのメモです。先人たちの知恵を拝見しつつ、やっただけなので、ウェブ上に情報はたくさんありますが、メモとして…。

前提

前提条件として、すでにサーバーが稼働しており、ドメインを割り振った状態とします(ドメインの移行についてはこちらを参照)。なお、今回はUbuntuがOSです。

証明書の取得

SSL化に必要な証明書を取得します。今回はLet's Encryptを利用します。

証明書はワイルドカード指定で複数のドメインに対応できるようですが、今回はサブドメインごとに取得します。

サーバーにSSHで入って:

sudo certbot certonly --webroot -w /var/www/html/cvla -d site1.example.com

sudo certbot certonly --webroot -w /var/www/html/cvla -d site2.example.com

sudo certbot certonly --webroot -w /var/www/html/cvla -d site3.example.com

いろいろとメッセージが出てきますが、従いつつ進めます。Congratulations!とでれば成功。

いちおう証明書ファイルの有無を確認します。

sudo ls -al /etc/letsencrypt/live/site1.example.com

この中に.pemという拡張子のファイルがいくつかあるはずです。

設定ファイルをいじる

/etc/apache2/sites-available/に移動

・まずはバックアップ

sudo cp default-ssl.conf default-ssl.backup.conf
・デフォルトファイルの設定を変更
(1)default-ssl.confの以下をコメントアウトあるいは削除
<virtualhost _default_:443>
~
</virtulahost>
(2)以下を追記
NameVirtualHost *:443

サブドメインごとにファイルを設定

※site1~3について同じことをする

#ファイルをコピー

sudo cp default-ssl.conf site1-ssl.conf

#ファイルを編集

sudo vi site1-ssl.conf

(1)

<virtualhost _default_:443>→<virtualhost *:443>
→virtualhost _default_を*に変更

(2)

ServerName site1.example.com:443

→これを追記

(3)

SSLCertificateFile /etc/letsencrypt/live/site1.example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/site1.example.com/privkey.pem

→この部分を編集

(4)
# 42行目:コメント解除して編集
SSLCertificateChainFile /etc/letsencrypt/live/site1.example.com/chain.pem

ファイルを有効化しサーバーを再起動

sudo a2ensite site1-ssl.conf
sudo systemctl reload apache2

ドメイン(含サブドメイン)をさくらVPSに移行する

はじめに

コアサーバーで使っていたドメインをさくらVPSに移行したときのメモです。

大まかな手順:

(1)ファイルをサブドメインごとにフォルダ分けしてVPSサーバーに移行する

(2)さくらVPSコントロールパネルでサブドメインを宣言する

(3)VPSサーバーでサブドメインの振り分けを設定する

(4)ドメイン発行元(今回はバリュードメイン)のネームサーバーを書き換える

サーバーはUbuntuApacheです。

(1)ファイルの移行

まずは旧サーバー(コアサーバー)にあるファイルをさくらVPSサーバーにコピーします(旧サーバーのファイルは残しておく)。このとき、サブドメインのファイルはフォルダごとにまとめておきます(site1, site2, site3のように)。

コピー後にIPアドレスでアクセスして(123.456.789.123/site1のようなアドレス)、ファイルが正常に動くことを確認します。CGIを使っている場合は別途色々と設定が必要です(詳細は省く)。パーミッションも注意しましょう。

※【雑多メモ】ファイルを上書きするときにパーミッションエラーになる場合があります。この場合は、ファイルのオーナーやグループを確認しましょう。FTPで接続している場合、そのユーザーをグループにするのがよいと思います。

chown www-data:ubuntu filename

www-dataはapacheのユーザー名で、ブラウザからアクセスするとこの権限になります。ubutntuはログインしているユーザー名とすると、これがグループメンバーになる設定です。

(2)さくら側でサブドメインを宣言する

さくらVPSのコントロールパネルから「DNS登録」を選びます。

ドメインコントロールパネル」に移動するので、「ネームサーバーに登録」からドメインを登録します(example.comなどを入力し、簡易設定を実行)。

その後、「ネームサーバーサービス」から先程作ったゾーンを指定して、サブドメインを登録します。

「レコードの追加」で「別名」をsite1, site2, site3のように指定します。

これでさくら側のネームサーバーに問い合わせがあったとき、「このサブドメインはこちらへ」という案内の設定ができたことになります。

(3)VPSサーバーで振り分けの設定をする

次にVPSサーバーで「このドメインならこのフォルダ(ファイル)を表示する」という指定をします。

sudo vim /etc/apache2/apache2.conf

apacheの設定ファイルを開き、以下をドメインの数だけ追記します。

NameVirtualHost サーバーのIPアドレス:80
<VirtualHost サーバーのIPアドレス:80>
    DocumentRoot /var/www/html/site1
    ServerName site1.example.com
</VirtualHost>

<VirtualHost サーバーのIPアドレス:80>
    DocumentRoot /var/www/html/site2
    ServerName site2.example.com
</VirtualHost>

<VirtualHost サーバーのIPアドレス:80>
    DocumentRoot /var/www/html/site3
    ServerName site3.example.com
</VirtualHost>

:wqで保存して再起動します。

sudo service apache2 restart

これで設定完了。

(4)ドメイン発行元のネームサーバーを書き換える

最後に、ドメイン発行元の設定をします。

このようにさくらのネームサーバーに向けます。

これで、example.comへ問い合わせがあれば、さくらのネームサーバー(NS1.DNS.NE.JP)に行き、さらにさくらのネームサーバーはそれをサブドメインに振り分け(site1, site2, site3)、VPSサーバーに到達します。VPSサーバーは、問い合わせのあったサブドメインそれぞれのフォルダを表示します(site1なら/var/www/html/site1)。

 

あとはこれをSSL化する、という作業が残っています…。

さくらVPSでCGIを動かすのにハマったところ

はじめに

サーバー上で少し重めのプログラムを動かす場合、レンタルサーバーではメモリが十分ではない場合が多いです。そのため、VPSを使うというのが第一選択肢になると思います。しかしながら、VPSは自由に設定できる反面、非常に多くの設定を自分でしなければなりません。ここでは完全に個人的なメモですが、ハマったところをメモしておきます。

CGIその前に

さくらVPSではSite Guardという高性能なファイアウォール的なアプリを無料で提供しています(個人で契約しようと思うと数十万)。これを使わない手はないので、スタートアップスクリプトでこれをインストールすることを選択しました(対応のOSが限られるので注意)。

最初の管理画面にたどり着くのに少し苦労しました。まず、自分が契約したサーバーのURL(IPではなく、sakura.ne.jpのほう)に:9943/を追加してアクセスします。

........sakura.ne.jp:9443/

で、ここでログイン画面が出てきますが、マニュアル記載のIDとパスワードを入れます。これがライセンス認証に必要なサポートIDとは異なりますので(こちらはヘルプに記載あり)、注意が必要。

間違いすぎてロックがかかった場合、これもマニュアル記載の方法でリセットできます。

全部マニュアルに書いてあるのですが笑、急ぐとハマります。

apacheの設定ファイルをいじる

スタートアップスクリプトapacheがインストールされます。CGIを有効化するには:

sudo vi /etc/apache2/conf-available/cgi-enabled.confとして以下を追記。

<Directory "/var/www/html">
    Options +ExecCGI
    AddHandler cgi-script .cgi .py
</Directory>

 

もう一つ:

sudo vi /etc/apache2/apache2.conf

var/wwwのところに:


Options Indexes FollowSymLinks
 ↓
Options Indexes ExecCGI FollowSymLinks

 

として、sudo systemctl restart apache2で再起動します。

CGIの有効化

sudo a2enmod cgidでサービスを立ち上げます。

ここまではウェブ検索で出てくる情報です。諸先輩方に感謝。

 

Pythonの設定

ここでハマりました。まずCGIファイルに書くPythonのパスをwhich python3で調べます。

#!/usr/bin/python3

こうなるのですが、この!が抜けてて、何時間かハマりました…。

あと、.profileにPATH="$PATH:$HOME/.local/bin"を追記してパスを通します。これは何かを実行したときにエラーが出たためこうしましたが、なんのときかは忘れました…。

pip3でちょっと重めの機械学習系のライブラリを入れたのですが:

  • sudo pip3とすること(pipではない、sudoにしないといいところに入らない)
  • 重たいパッケージをインストール場合はsudo pip3 --no-cache-dir install torchのようにすること
  • それでもだめ場合はスワップを設定すること

このあたりだ大事でした。特にsudo pip3にしないと、コマンドラインからは実行できるものの、CGIからはインポートエラーになりました。これはCGIの実行ユーザーがapacheのwww-dataになっていて、sudoなしでインストールしてしまうと、そのログインしていたユーザーのディレクトリにライブラリが入ってしまい、www-dataユーザーからはアクセスできない、ということのようです(しらんけど)。

ちなみに、tail -f /var/log/apache2/error.logとするとCGI実行時のエラーが読めるので、参考になります。

パーミッションの設定

いろいろやってもCGIで実行するとエラーが出て、ログを見るとpermission deniedみたいなことが書かれています。どうやら使用しているライブラリが勝手にlogファイルやキャッシュファイルを生成しているようで、これがwwwフォルダのパーミッション(www-dataでは書けない)と衝突しているようでした。

で、エラーがでるファイルやフォルダについて強引に作ったり、パーミッションを変更したりすれば大丈夫になりました。例えば以下のような感じです。

var/www内にて:sudo mkdir .cache #.cacheで書き込めないと言われたので先に作ってしまう
sudo chown www-data .cache #オーナーをwww-dataにする
sudo chmod 755 .cache #パーミッションを変更する

まとめ

sudoの重要さ、パーミッションの重要さ、メモリの重要さなどが身にしみました。丸一日かかりましたが、なんとか目的のファイルをブラウザから呼び出せるようになりました。このあと、ドメインの移転とHTTPS化が待っていますが、ひとまず。

書き殴りですが、いつもすぐに忘れてまた検索する羽目になるので、自分(ともしかしたらだれか)のためのメモでした。

 

 

 

PythonでCGIが動かないときにハマったこと(改行コード!)

はじめに

Pythonをサーバー上でCGIとして動かすとき(htmlファイルから呼び出す)、コードは合っているはずなのに、Internal Server Errorが出続けて数時間ハマる…ということになってしまいました。とてもシンプルなところでハマってしまっていました…(シンプルなものほど気が付かない)。

対処方法

サーバー上ではエラーメッセージを吐かないので、XAMPPのローカル環境で動かしてみました。すると:

End of script output before headers

というエラーを吐いていました。これを検索してみると、「改行コード」が原因らしいということが判明(以前も同じところでハマってしまってような…。よってメモを残します)。

で、改行コードを「LFのみ」に変更すると…。

無事動きました!超簡単なことですが、ハマっている最中はなぜか気づかないという…。

Slackの新規チャンネルに参加者を全員一括で登録する

はじめに

Slackに新しいチャンネルを作ったとき、そこに全員を一括で登録したい場合の操作を方法をメモしておきます。

調べた限りでは、全員をチャンネルに招待する/invite allのようなコマンドはないので、「メンションされた人がチャンネルにいなければ、招待の提案が出る」ということを利用します。

 

【参考サイト】

How do I invite all team members to a new Slack channel - Web Applications Stack Exchange

 

設定方法

(1)参加者のリストを取得する

まず、メンション形式(@name)で追加する人のリストを取得します。これには/whoコマンドを使います。

 

全員がいるチャンネル(「全体連絡」など)に行って、このコマンドを入力します。コマンドは自分にしか見えないので、他の人に書き込みが届く心配はありません。

f:id:semanticist:20220118164241p:plain

 

これを実行すると、以下のように(ぼやかしていますが…)、@aaa, @bbb, @ccc...のようなリストが出てきます。

f:id:semanticist:20220118165219p:plain

 

これをコピーします。

(2)チャンネルに参加者を登録する

コピーした@のリストを、新しいチャンネルに投稿します(貼り付けて送信)。

f:id:semanticist:20220118171515p:plain

 

すると、以下のように「参加していないけど、招待しますか」のような提案がきますので、「招待する」を選択します。

f:id:semanticist:20220118170303p:plain

これでこのチャンネルに登録されます。

 

新しいチャンネルにデフォルトで参加にする

この新しいチャンネルに新しい参加者にも必ず参加してほしい場合、これをデフォルトのチャンネルに設定します。これはウェブのadmin画面から設定する必要があります(アプリでは設定するところが見つかりませんでした)。

 

Slackアプリの自分のアイコン等→アカウント設定(ウェブページへ)

f:id:semanticist:20220118164408p:plain

 

ウェブページに飛ぶので:「設定と権限」→「デフォルトのチャンネル」

f:id:semanticist:20220118164549p:plain

ここにさきほどのチャンネル名を登録すればOKです。