なろう分析記録

『小説家になろう』をふくめ『ネット小説投稿サイト』を分析する。コード置き場,主にPython,javascript,たまに創作。

【ConoHa VPS】ubuntu20.04 + Flask + apache2 + mariaDB でSSL対応Webサーバーをセットアップした作業メモ【2022年1月版】

ConoHa VPSでwebサーバーの環境を構築

f:id:karupoimou:20220121063041p:plain

ConoHa VPSで環境構築した時の作業メモです

VPSの準備

今回の契約プラン:ConoHa VPS 1GB・2コア・100GB

ConoHa VPS を選んだのはメジャーどころで情報も多かったからです。少し使ってみた感想としては特に問題なく使えています

※なお今回レンタルサーバーではなくVPSにした理由はrequests-htmlを用いてスクレイピングを行いたかったからです
※あとフレームワークにFlaskを使っているのは単に慣れているからで、もしPythonをゼロから始める方であれば情報が多くてテンプレートも揃っているDjangoの方をおすすめします

f:id:karupoimou:20220121050007p:plain
ConoHa VPS

仮想サーバーの立ち上げ

OS:Ubuntu20.04

今回はConoHaに最初から用意されている「LAMP」テンプレートを用いてサーバーを立ち上げる

f:id:karupoimou:20220121050033p:plain
VPSの立ち上げ

※なお今回は省略しますが本番環境では、サーバーの立ち上げ時にSSH Keyを設定しておくのがベター

立ち上げた仮想サーバーのグローバルIPをメモ

VPSを立ち上げたらまず仮想サーバーのグローバルIPをメモする
f:id:karupoimou:20220121050236p:plain

IPのコピペ先

今回SSHクライアントはwindowsPowerShellを使用
configファイルを作っておけば非常にシンプルです。タイムアウト防止に「ServerAliveInterval 10」の記載をしておくとなお快適

Filezillaでログインしておく

Filezillaにログインして作業できる環境を作っておくと操作性が上がるのでおすすめ
ファイルの書き換えとかは、Filezillaでサーバーからローカルにファイルを移す → Atomとかのエディタで編集 → Filezillaで上書き という流れで行うと良いです

作業用ユーザの追加

SSH接続でrootでサーバーにログインし、まず新規ユーザーを追加します

sudo adduser hogehoge
sudo gpasswd -a hogehoge sudo

ここでは「hogehoge」というユーザーを作成し、「sudo」グループに追加しています

なおデフォルトのSSH接続ポートは「22」です
もしSSH接続出来ない場合はConoHaの「コンソール」から試すと良いかも

OSの更新関係

sudo apt update
sudo apt upgrade

OSの更新は時間掛かるのでテスト環境の場合は省略しても別によいです

webページの確認

今回はLAMPテンプレートを使っているのでこの段階でブラウザにグローバルIPを入力するとページがwebページが表示されます

f:id:karupoimou:20220121051559p:plain

pythonバージョン確認

python3 --version
>>Python 3.8.10

仮想環境を使う場合はpyenvを入れるのがベターとされていますが、pyenvを使うとパス関係で面倒くさいので今回はUbuntuに最初から入っているpythonをそのまま使います

各種パッケージのインストール(pip mod-wsgiなど)

sudo apt -y install python3-pip libapache2-mod-wsgi-py3
sudo apt install python3-selenium

先にpip本体をインストールしていないと以下のpipコマンドは使えないので、pip installでつまづく場合はまず「pip」と打ってみてコマンドが通るかどうか試すとよいです

pipでpythonパッケージをインストール

pip install --upgrade pip
pip install flask
pip install pandas
pip install requests-html
pip install xlrd
pip install openpyxl
pip install requests
pip install beautifulsoup4
pip install Flask-Bootstrap

pip-reviewでパッケージをアップデート

pip install pip-review
pip-review --auto

なおrequirements.txtを用いて一括インストールする方法もありますが、それはどちらかというと似ている環境からのお引越し用
今回の様な最初からVPSを立ち上げる様な場合は、1つ1つインストールした方が間違わなくてすむし、トラブルがあった際に原因を特定しやすいです

requests-htmlの依存パッケージのインストール

Puppeteerに関するものなど

sudo apt install -y gconf-service libasound2 libatk1.0-0 libatk-bridge2.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget

Puppeteerインストール - Qiita

**重要**
またrequests-htmlはChromeをブラウザとして使っているのでChromeを入れる必要がある
UbuntuにChromeをインストールする - Qiita


今回はrequests-htmlを用いてスクレイピングを行うのでPuppeteerの関係パッケージも入れておきます。使わない人はここは省略してよいです

port開放

sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 5000

sudo ufw reload
sudo ufw status

sudo ufw disable
sudo ufw enable

f:id:karupoimou:20220121052809p:plain

http/https接続するためにファイヤウォールを開けます
※なお22番ポートはデフォルトのSSHポートなので本番環境では別のポートに変えた方がよいです

MariaDBのセットアップ

今回はLAMPテンプレートに最初から入っているので省略

DBユーザーの作成

まずmariadbに入る

mariadb

次にDBユーザーを追加
CREATE USER 'hoge'@'localhost' IDENTIFIED BY 'ここにパスワード';
create database new_database;
GRANT ALL ON new_database.* TO hoge@'localhost';

ここでは「hoge」という名前のユーザーと、「new_database」という名前のDBを作成し、最後にhogeに該当DBの操作権限を付与しています
予め権限付与しないとphpMyAdiminでログインした時にDBが表示されないので注意

以下、Ctrl+Cでmariadbから出て操作

phpMyAdiminのインストール

sudo apt install phpmyadmin

サーバーの選択では、apache2を選択します
警告: プロンプトが表示される際、apache2がハイライト表示されますが、選択されているわけではありません。 SPACEキーを押してApacheを選択しないと、インストーラーがインストール中に必要なファイルを移動しません。    SPACE、TAB、ENTER キーを押してApacheを選択します。

Ubuntu 20.04にphpMyAdminをインストールしてセキュリティを保護する方法 | DigitalOcean

https://qiita.com/nanbuwks/items/6768bc73661bdba43af9

phpmyadminのページ確認は下記のapache2関係が終わった後にしたほうがよい。かも

SSL証明書の発行

https通信を行うためにはSSL証明書を発行する必要があるので取得操作

sudo apt install certbot
sudo systemctl stop apache2
sudo certbot certonly --standalone -d hogohogehoge.com

証明書が生成されたか確認

sudo ls /etc/letsencrypt/live/hogohogehoge.com/

Ubuntu 18.04 と Apache2.4 で Let’s Encrypt を利用して SSL 化する | 突撃なんでもチートシート

サーバー側でSSL設定を行う

/etc/apache2/sites-available/default-ssl.conf

https(443)用のデフォルトの設定ファイルは「default-ssl.conf」

デフォルトでは有効になっていないのでまず有効化する必要があります

sudo a2ensite default-ssl.conf
sudo a2enmod ssl
sudo systemctl restart apache2

そして内容を編集して上書き(編集前に必ずバックアップを取っておくこと!)

<IfModule mod_ssl.c>
	<VirtualHost _default_:443>

	ServerName hogehogehoge.com:443
	ServerAdmin webmaster@localhost

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	SSLEngine on
	SSLCertificateFile	/etc/letsencrypt/live/hogehogehoge.com/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/hogehogehoge.com/privkey.pem
	SSLCertificateChainFile /etc/letsencrypt/live/hogehogehoge.com/chain.pem

	DocumentRoot /var/www/html

	WSGIDaemonProcess wsgi_flask user=hogehoge group=sudo threads=5 lang=ja_JP.utf8
	WSGIScriptAlias / /var/www/html/myapp.wsgi

	<Directory /var/www/html>

    WSGIProcessGroup wsgi_flask
    WSGIApplicationGroup %{GLOBAL}
    WSGIScriptReloading On

    AllowOverride All
    Require all granted

  </Directory>

	<FilesMatch "\.(cgi|shtml|phtml|php)$">
			SSLOptions +StdEnvVars
	</FilesMatch>

	<Directory /usr/lib/cgi-bin>
			SSLOptions +StdEnvVars
	</Directory>

</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

一応http接続が来た場合にhttps443にリダイレクトする様に設定しておく

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

FileZillaなどで2つのファイルを上書きし、

sudo a2enmod rewrite
sudo service apache2 restart

を実行

.wsgi と .pyの作成

/var/www/html/myapp.py

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "hello world!!"
if __name__ == "__main__":
  app.run(host='0.0.0.0')


/var/www/html/myapp.wsgi

import sys, site, os

sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))

from myapp import app as application

from myapp のmyapp import app as application
「myapp」は読み込み先.pyのファイル名
「app」はファイルの中で読み込むアプリ名(Flaskでは大体「app」が使われている)

Apace2の再起動

sudo service apache2 restart

再起動すると.confの設定が反映されます

※なお「default-ssl.conf」で WSGIScriptReloading On の記載をしておくと、更新日時が新しいmyapp.wsgiがアップロードされると自動で.pyファイルなどがリロードされるので便利です

webページの確認

https://ドメイン名 でwebページが開けるか確認

ドメインとIPの紐付けには時間が掛かる場合があります

トラブルシューティング

.pyからファイルの読み出しは基本的に絶対パスを使う

コンソールではエラー無しで実行出来るのに、ブラウザから実行すると「500 Internal Server Error」が表示されるのは実行環境によってパスが異なるから。絶対パスを使うことで回避できます

Apacheの「500 Internal Server Error」のエラーログを読む

500 Internal Server Errorのエラーログはブラウザでは表示されない
「/var/log/apache2/error.log」に具体的な内容が書いてある(なおerror.logの設置場所は.conf内の記載にて変更可能)

,pyを更新した際の自動リロード

https://zafiel.wingall.com/archives/2309

SSHタイムアウトを延ばす

windows10のPowerShell を使っている場合「~/.ssh/config」に ServerAliveInterval 10 を追記するとよいです

Host [host]
    HostName ****
    User ****
    Port ****
    IdentityFile ****
    ServerAliveInterval 10 ←ここ
    ServerAliveCountMax 3
    TCPKeepAlive yes
requests_htmlでエラーは出ないけど、ページの要素が正しく取れない

requests_htmlはSelenium経由でGoogle Chromeを使っている
Google Chromeはpipで入れられないので手動で入れる必要がある
以下の参考ページの通りに順番にコードを実行していけば大丈夫です
UbuntuにChromeをインストールする - Qiita

メンテナンス中の閲覧制限

FlaskでIP制限する - Qiita
サーバーのメンテナンスで閲覧制限を掛ける方法としてはFlaskでIP制限を掛ける方法が最も簡単

ブラウザ経由でFlaskでファイルの読み書きをしようとしたら500エラーが表示される

rootでは問題なく通るのに、Flaskからだと通らないのはパーミッションのエラーの可能性が高い
エラーログに「PermissionError: [Errno 13] Permission denied」とあれば確実にそれ。
出力先のディレクトリの所有権を.confで指定しているFlaskを実行しているユーザに渡すと大丈夫になる

所有権を移すコマンド↓

chown -hR hogehoge:sudo /var/www/html/static/export

サーチコンソールを使うためのDNS設定

DNS設定のテキストはドメインを取得した場所(例:お名前.comなど)ではなく、運用中のサーバー(例:ConoHaなど)側で行う
ConoHa VPSドメインを使っている場合はConoHaのコントロールパネルの「DNS」から設定を行う
【2020】Google Search Consoleの登録方法をサーバー別に紹介! | キツネの惑星