こんにちは。てちてちエンジニアのおっとーです。
今回はXserverでDjangoで作成したウェブアプリを公開するところまでやっていきたいと思います。
(前任者が蒸発したDjangoプロジェクト)
顧客の要望もありXserverを本番環境とするとのことで初の試み。
そもそもXserverならLaravelとかの方が相性良さそうとか少し頭をよぎりましたが、
Djangoで4割完成していたものを書き換える手間を考えたら、
そのままで行こうとなったので無理やりやっていく。
なんだかんだで無事にデプロイできたので、備忘録の意味も込めて。
デプロイまでにしたこと
実際に実施した過程を整理して、この流れでやったらスムーズだなと思った流れで書いていきます。
基本的には順を追って進めれば無事デプロイできると思います。
Xserverの契約
バナークリック後に表示されるお申込みボタンから契約していきます。
契約完了したら、ログインボタンからログインします。
ドメインの契約
- TOP画面
- ドメイン取得をクリック
- 取得したいドメインを入力&選択
- 取得
この赤丸をクリックして
検索欄に好きなドメイン名を入力していく。
com/jpを使っておけばドメイン見て「このサイト怪しいな」と思われることはあまりないでしょう。
co.jp/or.jpなどなどの〇〇.jpは取得に条件があるので、気をつけましょう。
値段とドメインに納得したら、契約期間を決めて利用規約に同意にチェックして契約。
SSL設定
- サーバー管理ボタンを押下
- ドメインからSSL設定を探す
- 「独自SSL設定追加」タブをクリック
- CSR情報(SSL証明書申請情報)を入力するにチェックを入れる
- 表示されるフォームを入力
- 確認画面へ進むをクリック
- 反映まで待つ!
SSH接続
- サーバーパネル→アカウント→SSH設定
- SSH設定の状態をONにする
- パスフレーズを入力して公開鍵認証用鍵ペアの生成(1回しか使わないので何でも良いと思います)
- 公開鍵を登録
- PCのHOMEディレクトリの.sshフォルダを開く
- 生成した秘密鍵を.sshフォルダに配置
- configファイルの作成
- ssh xxxxxxでSSH接続を実行
初めてSSHフォルダを作成する場合は、以下を実行して読み書き権限の設定をします。
chmod 700 ~/.ssh
.sshファイルにconfigファイルを作って置くと次回からログインが便利。
- host:terminalからsshコマンドを簡略化する時の名前。
- HostName:初期ドメインを入力(サーバー情報のホスト名でもOK)
- Port:Xserverの場合10022固定
- IdentityFile:③でダウンロードしたKeyファイル
- ServerAliveInterval:接続切れ防止のメッセージ送信間隔(秒)
host xxxxxx
HostName xs△△△△△△.xsrv.jp
Port 10022
User xs△△△△△△
IdentityFile ~/.ssh/○○○○○○.key
ServerAliveInterval 60
これを設定しておけば、
ssh xxxxxx
(xxxxxxはhostに設定した値)でSSH接続できるようになります。
初回は③のパスフレーズを聞かれますので、それっぽい事がターミナル上に表示されたら入力してください。
FTPアカウント作成
- FTP→サブFTPアカウント
- ドメインを選択
- サブFTPアカウント追加タブをクリック
- FTPユーザーIDとパスワードを入力
- 確認画面へ進む
- FTPクライアントに①〜⑤で作成したアカウント情報を登録
- 接続
minicondaをインストール
- SSH 接続後にwgetでshファイルをダウンロード/もしくはFTP経由でshファイルを転送
- shコマンド実行
- Enter連打
- sourceコマンド実行
- lsコマンドでminiconda3フォルダが作成されていることを確認
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
上を実行したらエラーが発生した場合は
にアクセスして、
Miniconda3-latest-Linux-x86_64.sh
を検索してDLしましょう。
DLしたshファイルをFTP経由でホームディレクトリに追加します。
ホームディレクトリがわからない方は以下のコマンドを順に実行して確認して下さい。
cs $HOME
pwd
ファイルを配置したら同じ階層で次のコマンドを実行します。
sh Miniconda3-latest-Linux-x86_64.sh
色々聞かれるので完了するまでEnter
source ~/.bashrc
ls
もしくは
which conda
で存在確認、パスが通っていることを確認。
Python仮想環境の構築
- conda createで仮想環境を作成
- パッケージを一括インストール
conda create -n 仮想環境名 python=○.○
私は基本仮想環境名はcondaenv39などpythonのバージョンに合わせてつける。
pip install -r 読み込むファイル名.txt
読み込むファイル名.txtは
ローカル環境などでインストールしていたものを書き出しておく。
そのコマンドはこちら。
pip freeze > 書き出すファイル名.txt
Djangoプロジェクトのアップロード
FTP経由でアップロードしていく。
Django-admin startproject アプリ名
ローカル環境で上記コマンドでdjangoアプリを作成すると、アプリ名でフォルダが作成されるが、
アプリ名フォルダ以下(manage.pyが存在する階層)をXserverのドメインフォルダのpublic_html内にアップロードしていく。
Djangoの設定変更
- ALLOWED_HOSTの設定
- DEBUGの設定
- データベース情報の修正
- makemigrations
- migrate
- collectstatic
③でMysqlを使用する場合はXserverのMySQL設定のMySQL追加でデータベース追加&ユーザー追加しておく
settings.pyのALLOWED_HOSTSを実際のドメインに修正。
DEBUGをFalseに設定
ALLOWED_HOSTS = ['www.example.com','example.com']
DEBUG = False
DB設定は作成したものに合わせて設定してください。
DATABASES = {'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'database_name', 'USER': 'XXXXXX', 'PASSWORD': 'XXXXXX', } }
mysql使用時は以下のパッケージのインストールもお忘れなく。
pip install mysqlclient
SSH接続して
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic
.htaccessの編集
public_html直下にある.htaccessを編集します。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.cgi/$1 [QSA,L]
index.cgiの作成
- 仮想環境のPythonの場所を調べる
- 仮想環境のbinまでパスを通す
- DJANGO_SETTINGS_MODULEにウェブアプリのsettings.pyの場所を設定する
①②の調べ方
XserverにSSH後に以下を順番に実行
conda activate condaenv39
which python
cd $home
pwd
pwdで得たパスでwhich pythonで取得したパスの~を置換します。
/home/xs〇〇/miniconda3/envs/condaenv39/bin/python
こんな感じになるはず。
1行目の#!の後にはpythonの場所を、
sys.path.insertには1行目のbinまでを設定。
最終形は以下のような感じ。
#!/home/○○○○/miniconda3/envs/仮想環境名/bin/python
# coding: utf-8
import sys, os
sys.path.insert(0, "/home/○○○○/miniconda3/envs/仮想環境名/bin")
os.environ['DJANGO_SETTINGS_MODULE'] = 'アプリ名.settings'
from wsgiref.handlers import CGIHandler
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
CGIHandler().run(application)
最終的なファイル構成
public_html内はこんな感じ。
沼にハマりました
Brewインストールできないやんけ!
いろんなサイトを参考にさせていただきましたが、
Brewのインストールは色々躓いて結局うまく行かず。
minicondaをインストールする方法だとすんなり行けました。
index.htmlが邪魔をしていた
xserver初期状態のindex.htmlが存在している状態で、
Django側のTOPページをClassViewを使用しtemplate_nameをindex.htmlにしていると、
view.pyのレスポンス作成途中でエラーが発生する。
template_name指定時にdjango_appの階層から指定するか、Xserverが自動生成したindex.htmlを削除する必要がある。
自己解決の糸口
Xserverのエラーログとアクセスログ
サーバー管理→アクセス解析下にある
【アクセスログ】
もしくは
【エラーログ】
を確認するとcgi関連で躓いたときは有効。
DjangoのLog
Logger設定でLogをconsoleではなく、logファイルに吐き出すようにしておくとヒントを得られる。
Django内部でエラーは90%ログファイルを見れば解決できる。
Python index.cgiで直実行の結果を確認
index.cgiの記述に問題ないか心配な場合は、以下のコマンドをpublic_html下で実行すると確認できる。
記述ミスがある場合は動かない。
conda activate condaenv39
cd path/to/public_html
python index.cgi
fcgiに対応してみた(おまけ)
flupパッケージのインストール
pip install flup
cgiファイルをfcgiに変更
#!/home/○○○○/miniconda3/envs/仮想環境名/bin/python # coding: utf-8 import sys, os sys.path.insert(0, "/home/○○○○/miniconda3/envs/仮想環境名/bin") os.environ['DJANGO_SETTINGS_MODULE'] = 'アプリ名.settings'
fromflup.server.fcgi importWSGIServerfromdjango.core.wsgi importget_wsgi_application
application = get_wsgi_application()
WSGIServer(application).run()
.htaccessの書き換え
AddHandler fcgid-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.fcgi/$1 [QSA,L]