序章

この記事では、フレームワークの助けを借りずに、Python 3、MySQL、およびApache2を使用してサーバーをセットアップする方法について説明します。 このチュートリアルを終了するまでに、ベアボーンシステムを本番環境に完全に起動できるようになります。

Djangoは、多くの場合、Pythonのすべてのもののワンショップストップです。 Pythonのほぼすべてのバージョンと互換性があり、カスタムサーバーがあらかじめパッケージ化されており、ワンクリックインストールデータベースも備えています。 この強力なツールを使用せずにバニラシステムをセットアップするのは難しい場合がありますが、サーバー構造についてゼロから貴重な洞察を得ることができます。

このチュートリアルでは、パッケージインストーラー、つまりapt-getとPipのみを使用します。 パッケージインストーラーは、コードのインストールをはるかに便利で管理しやすくする単なる小さなプログラムです。 それらがないと、ライブラリ、モジュール、およびその他のコードビットを維持することは非常に厄介なビジネスになる可能性があります。

前提条件

このチュートリアルに従うには、次のものが必要です。

ステップ1—Python3をデフォルトにする

このステップでは、Python3をpythonコマンドのデフォルトとして設定します。

まず、現在のPythonバージョンを確認します。

  1. python --version

新しいUbuntu14.04サーバーでは、次のように出力されます。

Python 2.7.6

pythonでPython3を実行したいと思います。 まず、古い2.7バイナリを削除しましょう。

  1. sudo rm /usr/bin/python

次に、その場所にPython3バイナリへのシンボリックリンクを作成します。

  1. sudo ln -s /usr/bin/python3 /usr/bin/python

python --versionを再度実行すると、Python 3.4.0が表示されます。

ステップ2—Pipのインストール

このセクションでは、Pythonの推奨パッケージインストーラーであるPipをインストールします。

まず、システムのパッケージインデックスを更新します。 これにより、古いパッケージや古いパッケージがインストールに干渉しないようになります。

  1. sudo apt-get update

Pipを使用すると、必要なPython3パッケージを簡単に管理できます。 インストールするには、次のコマンドを実行するだけです。

  1. sudo apt-get install python3-pip

Pipの概要については、このチュートリアルをお読みください。

ステップ3—MySQLをインストールする

このセクションでは、MySQLをインストールして構成します。

SQLのインストールは簡単です。

  1. sudo apt-get install mysql-server

プロンプトが表示されたら、MySQL rootユーザーの強力なパスワードを入力し、後で必要になるため、覚えておいてください。

インストールが完了すると、MySQLサーバーが起動します。 インストール後、以下を実行します。

  1. mysql_secure_installation

この設定では、一連の自明の手順を実行します。 まず、少し前に選択したrootパスワードを入力する必要があります。 最初の質問では、rootパスワードを変更するかどうかを尋ねられますが、設定したばかりなので、nと入力します。 他のすべての質問については、 ENTER を押して、デフォルトの応答を受け入れます。

ただし、Python3にはMySQLに接続する方法が必要です。 MySQLclientのようにいくつかのオプションがありますが、モジュールを簡単にするために、このチュートリアルではpymysqlを使用します。 Pipを使用してインストールします。

  1. sudo pip3 install pymysql

ステップ4—Apache2をインストールする

このセクションでは、Apache 2をインストールし、Pythonファイルが実行可能ファイルとして認識されるようにします。

apt-getを使用してApacheをインストールします。

  1. sudo apt-get install apache2

MySQLと同様に、インストールが完了するとApacheサーバーが起動します。

:インストール後、いくつかのポートがインターネットに開かれます。 セキュリティに関するリソースについては、このチュートリアルの結論を確認してください。

Webサイトのルートディレクトリを安全な場所に配置したいと考えています。 サーバーはデフォルトで/var/www/htmlになっています。 慣例を守るために、同じ場所にtestというテスト用の新しいディレクトリを作成します。

  1. sudo mkdir /var/www/test

最後に、PythonをApacheに登録する必要があります。 まず、マルチスレッドプロセスを無効にします。

  1. sudo a2dismod mpm_event

次に、Apacheにスクリプトを実行するための明示的なアクセス許可を与えます。

  1. sudo a2enmod mpm_prefork cgi

次に、実際のApache構成を変更して、Pythonファイルを実行可能ファイルとして明示的に宣言し、そのような実行可能ファイルを許可します。 nanoまたはお気に入りのテキストエディタを使用して構成ファイルを開きます。

  1. sudo nano /etc/apache2/sites-enabled/000-default.conf

<VirtualHost *:80\>という最初の行の直後に次を追加します。

<Directory /var/www/test>
	Options +ExecCGI
	DirectoryIndex index.py
</Directory>
AddHandler cgi-script .py

同様に、<Directory>ブロックが<VirtualHost>ブロック内にネストされていることを確認してください。 タブでも正しくインデントするようにしてください。

/etc/apache2/sites-enabled/000-default.conf

<VirtualHost *:80>
	<Directory /var/www/test>
		Options +ExecCGI
		DirectoryIndex index.py
	</Directory>
	AddHandler cgi-script .py
	
	...

このDirectoryブロックを使用すると、Apacheがそのディレクトリをどのように処理するかを指定できます。 /var/www/testディレクトリに実行可能ファイルが含まれていることをApacheに通知し、index.pyをデフォルトファイルと見なして、実行可能ファイルを定義します。

また、Webサイトディレクトリで実行可能ファイルを許可したいので、DocumentRootのパスも変更する必要があります。 ファイル上部の長いコメントの数行下にあるDocumentRoot /var/www/htmlと表示されている行を探し、代わりに/var/www/testと表示されるように変更します。

DocumentRoot /var/www/test

これで、ファイルは次のようになります。

/etc/apache2/sites-enabled/000-default.conf

<VirtualHost *:80>
        <Directory /var/www/test>
                Options +ExecCGI
                DirectoryIndex index.py
        </Directory>
        AddHandler cgi-script .py
        
        ...
        
        DocumentRoot /var/www/test
        
		...

ファイルを保存して終了します。 これらの変更を有効にするには、Apacheを再起動します。

  1. sudo service apache2 restart

:Apache 2は、サーバーの完全修飾ドメイン名に関する警告をスローする場合があります。 ServerNameディレクティブは現時点ではほとんど適用されていないため、これは無視できます。 これらは、必要なレコードが作成された後、最終的にサブドメインホスティングを決定するために使用されます。

出力の最後の行が[ OK ]の場合、Apacheは正常に再起動しています。

ステップ5—最終製品のテスト

このセクションでは、サンプルのWebページとデータベースを作成することにより、個々のコンポーネント(Python、MySQL、およびApache)が相互に対話できることを確認します。

まず、データベースを作成しましょう。 MySQLにログインします。 以前に設定したMySQLルートパスワードを入力する必要があります。

  1. mysql -u root -p

exampleというサンプルデータベースを追加します。

  1. CREATE DATABASE example;

新しいデータベースに切り替えます。

  1. USE example;

Pythonアプリに追加するいくつかのサンプルデータのテーブルを追加します。

  1. CREATE TABLE numbers (num INT, word VARCHAR(20));

CTRL +Dを押して終了します。 SQLの詳細については、このMySQLチュートリアルを参照してください。

次に、単純なPythonアプリ用の新しいファイルを作成します。

  1. sudo nano /var/www/test/index.py

次のコードをコピーしてに貼り付けます。 インラインコメントは、コードの各部分が何をするかを説明します。 passwdの値を、前に選択したルートMySQLパスワードに置き換えてください。

#!/usr/bin/python

# Turn on debug mode.
import cgitb
cgitb.enable()

# Print necessary headers.
print("Content-Type: text/html")
print()

# Connect to the database.
import pymysql
conn = pymysql.connect(
    db='example',
    user='root',
    passwd='your_root_mysql_password',
    host='localhost')
c = conn.cursor()

# Insert some example data.
c.execute("INSERT INTO numbers VALUES (1, 'One!')")
c.execute("INSERT INTO numbers VALUES (2, 'Two!')")
c.execute("INSERT INTO numbers VALUES (3, 'Three!')")
conn.commit()

# Print the contents of the database.
c.execute("SELECT * FROM numbers")
print([(r[0], r[1]) for r in c.fetchall()])

保存して終了。

次に、新しく作成したファイルの権限を修正します。 3桁のアクセス許可コードの詳細については、Linuxアクセス許可のチュートリアルを参照してください。

  1. sudo chmod 755 /var/www/test/index.py

次に、お気に入りのブラウザを使用してhttp://your_server_ipに移動し、サーバーにアクセスします。 次のように表示されます。

http:// <^> your_server_ip <^>
[(1, 'One!'), (2, 'Two!'), (3, 'Three!')]

おめでとう! サーバーがオンラインになりました。

結論

これで、堅牢なSQLデータベースでPython3を実行できるサーバーが稼働しました。 サーバーは、十分に文書化され確立されたパッケージインストーラーを介して、簡単に保守できるように構成されています。

ただし、現在の状態では、サーバーは部外者に対して脆弱です。 SSL暗号化などの要素はサーバーの機能に不可欠ではありませんが、信頼性が高く安全なサーバーにとって不可欠なリソースです。 詳細については、 Apacheの構成方法 Apache SSL証明書の作成方法、およびLinuxサーバーのセキュリティ保護方法を参照してください。