未分類

前回はbottleだったので今回はdjangoを同じようにやってみようと思います。やることはdjango tutorialです。

venvの仮想環境構築

$ cd ~/public_html/elephantcat.work/cgi-bin/
$ python3 -m venv fordjango
$ . ./fordjango/bin/activate
(fordjango) $ 

djangoのインストール

(fordjango) $ pip install --upgrade pip
(fordjango) $ pip install django
(fordjango) $ python -m django --version
3.0.2

djangoプロジェクト作成

(fordjango) $ django-admin startproject djangoroot
(fordjango) $ cd djangoroot

このフォルダにはパスワードなども入るので、今のうちに.htaccessでwebからアクセスできないようにしておきます。

deny from all

django用のmysql設定

djangoはデフォルトだとdatabaseにsqlite3を使います。VALUE-SERVERでも sqlite3は使えるのですが、バージョンに問題があって、エラーになります。なので今回はmysqlを使います。私のようにエコプランの方はdatabase1つしかないのでテーブル名に衝突がないように注意してください。

さて、WordPressとか使うために事前にmysql自体の設定はしてますよね?そこは端折って、djangoからmysqlを使う設定をしていきます。

(fordjango) $ vi djangoroot/settings.py

↓な辺りをこんなふうに修正します。

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        'ENGINE': 'django.db.backends.mysql',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'NAME': 'databasename', # VALUE-SERVERではユーザーIDと同じ
        'USER': 'username', # ユーザーIDを入れてください
        'PASSWORD': 'password', # パスワードを入れてください
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

ここでオススメされてるpython用のmysql接続モジュールをインストール

(fordjango) $ pip install mysqlclient

Pollsアプリの作成

(fordjango) $ python manage.py startapp polls

チュートリアルのとおりにviewを用意します(プロジェクト名だけdjangorootなので注意)。

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
"""djangoroot URL Configuration
ドキュメントコメントなので省略
"""
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

チュートリアルはまだ続くわけですが、この辺で一回画面が見たい…でもrunserverはレンタルサーバでは出来ないので、重い腰を上げてCGIで繋ぎます。

CGIでdjangoを呼ぶ

今さら断っておくと、djangoは正式にCGIをサポートしていません。サポートしているのはFastCGI/SCGI/WSGIとかです。理由はとにかく遅いから!

遅くてもいいからとにかく繋ぎたいんじゃ~という人のためにチョロっとCGIスクリプトを書いてくれたものがコレ

これをcgi-binに置くのですが、そのままでは使えないので、まずはこちらの環境に合わせてシバンをvenv用に直します。

#!(ホーム)/public_html/elephantcat.work/cgi-bin/fordjango/bin/python
...

次に最後の部分をdjangoプロジェクトの設定に合わせれば使えます。

...
# Change this to the directory above your site code.
sys.path.append("(ホーム)/public_html/elephantcat.work/cgi-bin/djangoroot")
# Change mysite to the name of your site package
os.environ['DJANGO_SETTINGS_MODULE'] = 'djangoroot.settings'
run_with_cgi(get_wsgi_application())

ここまでで実行可能にすればdjangoフレーム自体は動作します。が、最後にサイトの設定settings.pyを修正します。

許可ドメイン追加とデバッグ設定OFF。 デバッグ設定OFFにするとエラー発生時のデバッグ情報からパスワードなどの漏洩が防げます。

...
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = [
    'elephantcat.work'
]
...

あとはcgiスクリプトを実行可能にするだけ!

(fordjango) $ chmod u+x django.cgi

上記で動作するようになったpollsアプリがこちら

実際のチュートリアルはまだ続くのですが、今回はここまで。

一応再度書いておくと、djangoはCGIで使っちゃダメです。

未分類

2020年1月12日現在

VALUE-SERVERでPython

VALUE-SERVERではpython3が使用できる。

$ python3 --version
Python 3.6.8

VALUE-SERVERではapacheが動いていて、WSGIが使えない。

$ apachectl -M 2>/dev/null | grep wsgi
$

VALUE-SERVERではapacheが動いていて、CGIが使える。

$ apachectl -M 2>/dev/null | grep cgi
 cgi_module (shared)
$

つまり、django、flask、bottleなどのPython向けWeb Frameworkを使いたい場合の選択肢は、CGIのみということ。

Webサーバとの接続では軽量な順に

言語独自I/F ≧ WSGI > FastCGI > CGI

だと思うので、I/Fとしては最重量。そこで今回は最も軽量なFrameworkであるbottleでのHello, World!をやってみる。

bottleでのHello, World!

python3ではvenvが標準装備なので、これを使って仮想環境を構築し、そこにpipでbottleを入れる。

ディレクトリ構成は以下な感じ。

~/                                  # ホーム
~/public_html/                      #
~/public_html/domain/               # Webの公開ルートフォルダ
~/public_html/domain/cgi-bin        # CGI実行するファイルを置くフォルダ
~/public_html/domain/cgi-bin/forcgi # venvで構築する仮想環境

venvによる仮想環境作成とbottleインストール

$ cd ~/public_html/domain/cgi-bin
$ python3 -m venv forcgi
$ . ./forcgi/bin/activate
(forcgi)$ pip install --upgrade pip
(forcgi)$ pip install bottle
(forcgi)$ deactivate

bottleを使ったhello, worldアプリをpythonで書く(拡張子はCGIなので.cgiにしてます)。

#!$HOMEの内容/public_html/domain/cgi-bin/forcgi/bin/python
from bottle import route, run
@route('/')
def hello():
    return "Hello World!"
run(server='cgi')

シバンで、仮想環境のpythonを指定しているのが味噌で、こうしておくと、activateしなくてもpipで入れたパッケージをちゃんと見てくれます。

cgi-binディレクトリで、ちゃんとCGIが機能する設定を入れるため、.htaccessを書いておきます。

AddHandler cgi-script .cgi

これで、拡張子.cgiなパスはそのファイルで処理されます。後は先に作成したhello.cgiの実行権を与えればOK。

$ chmod u+x hello.cgi

このサーバにあるので、ConoHa VPSに引っ越したので、確認は/cgi-bin/hello.cgi/で出来ません。

ConoHa VPSで(WSGIですが)bottleを扱った記事は以下にあります。

未分類

まるっとプランで今回ドメインも借りてるわけですが、普通にWordPress(以下WP)を入れると、最初はHTTPでした。借りてるドメインではなく、VALUE-SERVERのサブドメインで、HTTPでアクセスする形ということです。

誰も見てないだろうし、何も守るものもないわけですが、一応認証してるサイトなので、いつまでもHTTPというわけにも行きません。そこで、このWPも借りてるドメインで、HTTPSでアクセスする形に対応してみました。

対応と言っても何をしたわけではなく、ブラウザのアドレスバーのスキームとホスト名部分を変えただけです。

ところが

普通にHTTPSでアクセスしてみると、スタイルシートの適用が全くされてない素のHTMLが表示されています。

よくよく見るとHTMLからリンクされているCSSなどが根こそぎHTTP + VALUE-SERVERのサブドメインになっています。chromeは優秀なのかこれを良しとせずエラーで弾き、GETしないため素のHTMLが表示されたというわけです。

PHPはよく知らないので結構探しましたが、WPはURLを2つ持っており、それをリンク先生成時のアドレスに使用しているため、 そうなっているようです。管理画面でいうと、設定の、

  • WordPress アドレス
  • サイトアドレス

です。これらはファイルではなく、Databaseのwp_optionsテーブルに保管されていました。

解決

なので、管理画面からこれらのURLをhttpsの所定のURLに書き換えることにより、リンク先のURLもその下のURLになり、無事スタイルも適用されました。

でもなんでアクセスされたURLが分かっているのに、わざわざ固定のURLからリンク先を生成しているのか?やや不思議な気持ちです。まあ負荷分散とかした際にリクエストURLが消えてしまうとかセキュリティ上の理由とかなんでしょうね。いずれにしても設定で出来るのではなく強制なのが気持ち悪いところです。

未分類

「無料だし、レンタルサーバ様と違って全然何も出来ないんだろう」と思ってHeroku始めてみました。

甘かったです

性能面ではやっぱり有料の方がいいのですが、機能面がはるかに優れていました。ブログしたいだけなら、ココVALUE SERVERでいいんですよ。でもプログラミングもしてみたいんです。

Qiitaはプログラミングの記事は書けても動かすことができません。

Githubはソースを置くことは出来ても動かすことができません。

ココ VALUE SERVERは、不自由もありますが、記事も書けるし、ソースも置けるし、動かすことも出来ちゃいます。有料だけど。

しかしHerokuでも全部出来ちゃいます。容量や性能は低いのですが、何でも出来ちゃうのです。node.jsでもJavaでも何でもいいのですよ。そして無料!弱点はそうですね…

  • 30分アクセスがないと完全に停止し、次のアクセスにすごい時間かかる
  • DBの容量やファイルの容量などが少ない

何せ昨日使い始めたばかりなので、まだ良くわかりませんが、弱点この程度だと思います。もちろん有料になるとこれらの弱点は全て排除されます。メリットを考えると、デメリット少なすぎな印象です。

しばらくしたら比較記事でもまとめてみましょうかね。

ちなみにHerokuはSpring Boot4で作ったWebアプリが、JNI経由で自作共有ライブラリ(バイナリ)をロードしてopenjdk11で動きました。

このサーバでは逆立ちしても無理です。

未分類

去年の11月くらいに年間2000円弱でレンタルサーバ借りたので、とりあえず勿体ないから作ってみました。

このサイト多分今年の10月くらいには契約切れでなくなります ?