【ConoHa VPS】ubuntu20.04 + Flask + apache2 + mariaDB でSSL対応Webサーバーをセットアップした作業メモ【2022年1月版】
ConoHa VPSでwebサーバーの環境を構築
ConoHa VPSで環境構築した時の作業メモです
VPSの準備
今回の契約プラン:ConoHa VPS 1GB・2コア・100GB
ConoHa VPS を選んだのはメジャーどころで情報も多かったからです。少し使ってみた感想としては特に問題なく使えています
※なお今回レンタルサーバーではなくVPSにした理由はrequests-htmlを用いてスクレイピングを行いたかったからです
※あとフレームワークにFlaskを使っているのは単に慣れているからで、もしPythonをゼロから始める方であれば情報が多くてテンプレートも揃っているDjangoの方をおすすめします
仮想サーバーの立ち上げ
OS:Ubuntu20.04
今回はConoHaに最初から用意されている「LAMP」テンプレートを用いてサーバーを立ち上げる
※なお今回は省略しますが本番環境では、サーバーの立ち上げ時にSSH Keyを設定しておくのがベター
立ち上げた仮想サーバーのグローバルIPをメモ
VPSを立ち上げたらまず仮想サーバーのグローバルIPをメモする
IPのコピペ先
今回SSHクライアントはwindowsのPowerShellを使用
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の更新は時間掛かるのでテスト環境の場合は省略しても別によいです
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
**重要**
また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
http/https接続するためにファイヤウォールを開けます
※なお22番ポートはデフォルトのSSHポートなので本番環境では別のポートに変えた方がよいです
DBユーザーの作成
まず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ファイルなどがリロードされるので便利です
トラブルシューティング
.pyからファイルの読み出しは基本的に絶対パスを使う
コンソールではエラー無しで実行出来るのに、ブラウザから実行すると「500 Internal Server Error」が表示されるのは実行環境によってパスが異なるから。絶対パスを使うことで回避できます
Apacheの「500 Internal Server Error」のエラーログを読む
500 Internal Server Errorのエラーログはブラウザでは表示されない
「/var/log/apache2/error.log」に具体的な内容が書いてある(なおerror.logの設置場所は.conf内の記載にて変更可能)
,pyを更新した際の自動リロード
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制限を掛ける方法が最も簡単