Webページの公開
2023-02-06
いつでもどこでも誰もが見られるWebページ
今まではローカルネットワーク「http://127.0.0.1:8000/」上に設置していた。世界中に公開するには「127.0.0.1」ではなく、公開のためのドメインを取得する必要がある(例えば「sample.com」や「test.jp」など)。このドメインを通して世界中で繋がっているネットワークに公開される。
次にドメインにサーバーを設置する。サーバーを設置することによって訪問者にアクセスされたとき、どのように返答するかを管理する。大抵の場合、index.html
やindex.php
などのファイルを返し、Webページを表示している。
サーバー内はディレクトリ構造になっていて公開用のフォルダーを用意する必要がある。今回は「/home/user_name/www/test」が公開フォルダとして話を進める。またドメイン名は「test.domain」とする。つまり、「http://test.domain/test」にアクセスするとWebページが表示されるようにする。
準備と方針
準備として必要なのはサーバーとドメインの取得である。今回、サーバーはレンタルサーバーを想定している。レンタルサーバーを借りると初期でドメインも使えるところがある。レンタルサーバーの場合、常時プログラムを動かし続けることが困難なので後に述べるcgiファイルを用いている。余談だが、レンタルサーバーの上位であるVPSやクラウドサーバー、専用サーバーはサーバーのOSから管理しなくてはいけないのでハードルが高いと感じた。自分で管理できる点制限がなく自由にできるというメリットはある。
方針としては
- djangoを使うためpython環境を整えるためにpyenvとpyenv-virtualenvを導入
- 環境を整えた後、djangoでwebページを設置
- cgiファイルを使ってアクセスされたときページを表示
のように行う。
サーバー内でpython環境を整える
サーバーにsshでログインする。
ssh user_name@test.domain
bashで操作を行うためシェルを変える。
cash -s /usr/local/bin/bash
bash
echo $bash
GitHubからpyenv
とpyenv-virtualenv
をサーバーにクローン (ダウンロードして移動) する。
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
cd ~/.pyenv && src/configure && make -C src
git clone https://github.com/pyenv/pyenv-virtualenv.git~/.pyenv/plugins/pyenv-virtualenv
.bashrc
と.bash_profile
に以下を追記する。これらのファイルがない場合ファイルを作成する。
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
pyenv
でpython
をインストールし、pyenv-virtualenv
で仮想環境を構築する。今回はdjango_test
という環境名。そしてその仮想環境をアクティブにする。そして仮想環境内でdjango
をインストールする。
pyenv install 3.7.13
pyenv virtualenv 3.7.13 django_test
pyenv activate django_test
Pip install django
djangoでWebページを設置する
python
環境を実行したいディレクトリに移動し、そのディレクトリ以下でpython
の環境を使えるようにする。また公開するフォルダ「test」を作成しておく。
cd /home/user_name/www
pyenv local django_test
mkdir test
このあとはdjango
を設置していく。
django-admin startproject ProjectName
cd ProjectName
python manage.py startapp webpage
続いてsettings.py
を以下を追記する。
DEBUG
はテスト環境 (True
) と本番環境 (False
) を設定する。テスト環境では何かエラーがあるとエラー内容を示してくれるが様々な変数の値が見えてしまうのでセキュリティ的に良くない。そのためFalse
を設定する。
コード1.
/home/user_name/www/ProjectName/ProjectName/settings.py
DEBUG = False
ALLOWED_HOSTS = ['test.domain']
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'webpage.apps.WebpageConfig',
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
urls.py
やviews.py
、index.html
を作成していく。
コード2.
/home/user_name/www/ProjectName/ProjectName/urls.py
from django.contrib import admin
from django.urls import path, include
from django.views.generic import RedirectView
urlpatterns = [
path('admin/', admin.site.urls),
path('webpage/', include('webpage.urls')),
path('', RedirectView.as_view(url='webpage/', permanent=True)),
]
コード3.
/home/user_name/www/ProjectName/webpage/urls.py
from django.urls import path
from . import views
app_name = 'webpage'
urlpatterns = [
path('', views.index, name='index'),
]
コード4.
/home/user_name/www/ProjectName/webpage/views.py
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
コード5.
/home/user_name/www/ProjectName/templates/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Webページ</title>
</head>
<body>
<div style="text-align: center; line-height: 100vh;">
<h1>ようこそWebページへ!</h1>
</div>
</body>
</html>
cgiファイルの設置
index.cgiを以下のようにして「https://your.doamin/test/index.cgi/webpage/」にアクセスすると公開される。
コード6.
/home/user_name/www/test/index.cgi
#!/home/user_name/.pyenv/versions/3.7.13/envs/django_test/bin/python3.7
# coding: utf-8
import sys
import os
from wsgiref.handlers import CGIHandler
from django.core.wsgi import get_wsgi_application
sys.path.append(‘/home/user_name/www/ProjectName’)
os.environ['DJANGO_SETTINGS_MODULE'] = 'ProjectName.settings'
application = get_wsgi_application()
CGIHandler().run(application)