エックスサーバー上でDjangoを動かす方法をまとめました。
環境
- Windows10
- Python 3.7.3
事前準備
サブドメインの設定
エックスサーバーでサブドメインを設定しておきます。
サブドメインの設定方法は公式ページを参照してください。
webappという名前で今回は設定しました。
設定してから数時間で設定が反映されるはずです。
SSHの設定
サーバー側でコマンドを入力するためにSSH接続の設定をする必要があります。
SSHの設定は公式ページを参照してください。
SSHの接続にTeraTermを使用しました。
Linuxbrewのインストール
SSHで接続後にLinuxbrewをインストールします。
Linuxbrewのインストール方法は下記のページが参考になります。

python3のインストール
サーバー上でbrewコマンドを使用してpython3をインストールします。
1 |
$ brew install python3 |
インストール後にpython3とpip3がインストールされているか確認します。
1 2 3 4 |
$ python3 -V Python 3.7.3 $ pip3 -V pip 19.0.3 from /home/ユーザー名/.linuxbrew/opt/python/lib/python3.7/site-packages/pip (python 3.7) |
pipenvのインストール
pipenvをインストールします。
1 |
pip3 install pipenv |
Djangoを動かす
ローカルPC上で行う作業
自分のPCでpipenvをインストールします。
1 |
pip install pipenv |
プロジェクト用のフォルダを作成します。
1 2 |
mkdir test cd test |
pipenvでDjangoをインストールします。
1 |
pipenv install django |
pipenvの仮想環境内に入ります。
1 |
pipenv shell |
Djangoのプロジェクトを作成します。xserver_testとしてみました。
1 |
django-admin startproject xserver_test |
testappという名前のアプリケーションを作成します。
1 |
python manage.py startapp testapp |
setting.pyにアプリケーションを登録します。
1 2 3 4 5 6 7 8 9 |
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'testapp' ] |
xserver_testフォルダ内のurls.pyをtestappフォルダ内のurls.pyを参照するように変更します。
1 2 3 4 5 6 7 |
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('',include('testapp.urls')) ] |
testapp内のurls.pyを新規作成します。
1 2 3 4 5 6 |
from django.urls import path from . import views urlpatterns = [ path('', views.index) ] |
testapp内のviews.pyを変更してhttpレスポンスを返すようにします。
1 2 3 4 5 |
from django.shortcuts import HttpResponse def index(request): return HttpResponse('Hello world!') |
runserverコマンドを入力して http://127.0.0.1:8000/ にアクセスします。
1 |
python manage.py runserver |
Hello world!と表示されれば成功です。
settings.pyのDEBUGとALLOWED_HOSTSを変更します。
1 2 3 |
DEBUG = False ALLOWED_HOSTS = ['*'] |
エックスサーバーで行う作業
事前準備でサブドメインを作成していると、public_html内に
サブドメイン名フォルダが作成されています。
Teratermでサブドメイン名フォルダに移動してtestフォルダを作成します。
1 2 3 |
$ cd /home/ユーザー名/ドメイン名/public_html/サブドメイン名/ $ mkdir test $ cd test |
ローカルPC上で作成したファイルをエックスサーバーのtestフォルダに転送します。
エックスサーバーのファイルマネージャーを利用してファイルをアップロードするか
WinSCPなどのFTPクライアントを利用してファイルを転送します。
ファイル転送後のtestフォルダの構成は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
│ manage.py │ Pipfile │ Pipfile.lock ├─testapp │ │ admin.py │ │ apps.py │ │ models.py │ │ tests.py │ │ urls.py │ │ views.py │ │ __init__.py │ └─migrations │ └─ __init__.py │ └─xserver_test │ settings.py │ urls.py │ wsgi.py └ __init__.py |
Teraterm上でpipenvを利用して仮想環境を作成します。
PipfileとPipfile.lockを元に必要なモジュールを仮想環境に自動的にインストールします。
1 |
$ pipenv install |
pipenvのvenvオプションで仮想環境のパスをメモしておきます。
1 2 |
$ pipenv --venv 仮想環境のパスが表示されるのでメモしておきます |
testフォルダに.htaccessファイルをファイルマネージャーで作成するか
またはローカルで作成して、FTPクライアントで転送します。
1 2 3 |
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /test/index.cgi/$1 [QSA,L] |
index.cgiファイルをファイルマネージャーで作成するか
またはローカルで作成して、FTPクライアントでtestフォルダに転送します。
1行目には先程メモした仮想環境のパスをシェバンとして設定します。
文字コードはUTF-8で保存して、パーミッションを755に設定します。
1 2 3 4 5 6 7 8 9 10 11 |
#!pipenv仮想環境のパス/bin/python3.7 import sys, os sys.path.insert(0, "pipenv仮想環境のパス/bin") os.environ['DJANGO_SETTINGS_MODULE'] = "xserver_test.settings" from wsgiref.handlers import CGIHandler from django.core.wsgi import get_wsgi_application application = get_wsgi_application() CGIHandler().run(application) |
サブドメイン.ドメイン/test にブラウザでアクセスして
Hello world!と表示されればDjangoが動いていることを確認できます。
追加設定
FastCGIの設定もできるようです。

コメント
突然失礼いたします。書き間違い?を発見したので報告させていただきます。
事前準備>pipenvのインストールのコマンドがpython3→pip3かと思います。初心者なので間違っていたら無視してください。
このサイトがとても見やすくて、いつも参考にさせていただいております。
残しておく必要もないと思うのでコメント自体は削除しちゃってかまいません。
失礼しました。
ゆあさん
コメントありがとうございます。
pip3に修正しました。
はじめまして。非常にわかりやすい解説ありがとうございます。
xserver 上に’pip3 install pipenv’を行ったところ下記のような表示がでました。
PermissionError: [Errno 13] 許可がありません: ‘/etc’
権限で777を付与しても上記の反応がみられます。検索しても
わからなかったのでご教示いただけますと幸いです。
ローカルからxserver上に持ってきたtestディレクトリで、brew install pipenvを行ったところインストールできました。
ただ、最後まで進んでサブドメイン/testをやりましたが、500でした。。。何が原因かさっぱりわからなきのですがbrewでインストールした事が原因と考えられるでしょうか?
くにさん
コメントありがとうございます。
>brewでインストールした事が原因と考えられるでしょうか?
brewでpipenvをインストールしたことでエラーが発生している可能性はあります。
また、私が導入途中でステータスコード500のエラーになったときは、index.cgiの書き方が間違っている時に発生しました。
index.cgiの内容もあわせて確認してみたほうがよいと思います。
Windows10環境で手順を実行し、ローカルでのHello world!には成功しましたが、
エックスサーバーにChromeでアクセスしたところ500エラーでした。
手順を実行するに際しては特に引っ掛かった部分もなかったのですが、
シェバンに設定する『 [pipenv –venv]の戻り値 /bin/python3.7』について、
作業時には3.8.5(*)がインストールされましたので、3.8に記述を変えましたが、
そもそも /bin に python3.7ないし3.8 というファイルがありません。(FFFTPで確認)
原因として何が考えられるでしょうか?
*TeraTermからpython3 -V で3.8.5がインストールされているのは確認済み
すいません、自己解決しました。
index.cgiをUTF-8で保存する際に、BOMをつけていたのが原因だったようです。
参考にさせていただいています。
ご存知でしたら教えてください。
Linuxbrewをインストールすると、以下3つのエラーが出ます。
私はX10のプランなのですが、同じでしょうか?
何か原因ご存知でしたら教えてください。
curlの更新も試しましたが、バージョンは7.29.0の変更できずでした…
参考
https://kengotakimoto.com/post-1894/#toc4
エラー
———————–
Error: Please update your system cURL.
Minimum required version: 7.41.0
Your cURL version: 7.29.0
Your cURL executable: /usr/bin/curl
Error: Please update your system Git.
Minimum required version: 2.7.0
Your Git version: 1.8.3.1
Your Git executable: /usr/bin/git
Error: Curl must be installed and in your PATH!
Failed during: /home/loosecarrot/.linuxbrew/bin/brew update –force
———————–
大野さん
コメントありがとうございます。
私もX10のプランを使用しています。
>curlの更新も試しましたが、バージョンは7.29.0の変更できずでした…
参考先のURLを確認すると /home/[サーバーID]/opt に最新のcurlをインストールしています。
エラー内容を確認すると /usr/bin/curl のcurlを実行しているのでバージョンが古いままになっていると思います。
シェル変数PATHに /home/[サーバーID]/opt を /usr/bin/ より前に追加してcurlを実行すれば、インストールした最新のcurlが使われるのではないかなと思います。
エックスサーバーに付属のMySQLを利用しようとすると、pipenv install 時にmysqlclientのインストールが失敗します。
[サーバー名 src]$ pipenv install mysqlclient
Installing mysqlclient…
Error: An error occurred while installing mysqlclient!
Error text: Collecting mysqlclient
Using cached mysqlclient-2.0.3.tar.gz (88 kB)
ERROR: Command errored out with exit status 1:
command: /home/サーバー名/ドメイン/public_html/src/.venv/bin/python -c ‘import sys, setuptools, tokenize; sys.argv[0] = ‘”‘”‘/tmp/pip-install-3r8htlu7/mysqlclient/setup.py'”‘”‘; __file__='”‘”‘/tmp/pip-install-3r8htlu7/mysqlclient/setup.py'”‘”‘;f=getattr(tokenize, ‘”‘”‘open'”‘”‘, open)(__file__);code=f.read().replace(‘”‘”‘\r\n'”‘”‘, ‘”‘”‘\n'”‘”‘);f.close();exec(compile(code, __file__, ‘”‘”‘exec'”‘”‘))’ egg_info –egg-base /tmp/pip-pip-egg-info-1eca8uz0
cwd: /tmp/pip-install-3r8htlu7/mysqlclient/
Complete output (15 lines):
/bin/sh: mysql_config: コマンドが見つかりません
/bin/sh: mariadb_config: コマンドが見つかりません
/bin/sh: mysql_config: コマンドが見つかりません
Traceback (most recent call last):
File “”, line 1, in
File “/tmp/pip-install-3r8htlu7/mysqlclient/setup.py”, line 15, in
metadata, options = get_config()
File “/tmp/pip-install-3r8htlu7/mysqlclient/setup_posix.py”, line 70, in get_config
libs = mysql_config(“libs”)
File “/tmp/pip-install-3r8htlu7/mysqlclient/setup_posix.py”, line 31, in mysql_config
raise OSError(“{} not found”.format(_mysql_config_path))
OSError: mysql_config not found
mysql_config –version
mariadb_config –version
mysql_config –libs
—————————————-
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
This is likely caused by a bug in mysqlclient. Report this to its maintainers.
✘ Installation Failed
同様のトラブルに見舞われている方が結構いるようで、root権限が必要なディレクトリにあるmysql_configを編集することでの解決策しか見つかりませんでした。
しかし、エックスサーバーはroot権限が無いのでmysql_configファイルが、そもそも見えてません。
Djangoをmysqlclient以外のdb.backendsが利用可能なバージョンまで落とす以外に方法はないのでしょうか?
もしも解決策をご存じでしたらご教授いただければ幸いです。