• ホーム
  • 設定
  • 仮想マシンにCentOS7をインストールしてApache2.4とDjango2.0をセットアップする

仮想マシンにCentOS7をインストールしてApache2.4とDjango2.0をセットアップする

vmware workstationにCentOS7 minimal をインストールして、Apache2.4でDjango2.0を動かしてみます。 さくらVPSの練習です。

仮想マシンのハードウェアは、ストレージを20GBに、メモリを512MBにし、ネットワークアダプタをブリッジに設定します。

さくらインターネットの チュートリアル:CentOS 7(さくらのVPS)サーバ作成直後に設定しておくべき初期セキュリティ設定 に従って設定を進めていきます。

ただし、VPSと仮想マシンでそもそも前提が異なるところがありますので、そのあたりは仮想マシンにあわせていきます。

目次

  1. ネットワークアダプタの設定
  2. 一般ユーザーの作成
  3. 公開鍵認証の設定
  4. sudoの設定
  5. nanoのインストール
  6. SSH接続時にrootでのログインを禁止
  7. SSH接続時にパスワード認証を禁止
  8. SSHのポート番号の変更
  9. アップデート
  10. 日本語環境への変更
  11. Apacheのインストール
  12. Python3をyumでインストール
  13. 開発ツールのインストール
  14. mod_wsgiのインストール
  15. Djangoのインストール
  16. その他のPythonのパッケージのインストール

ネットワークアダプタの設定

仮想マシンは初期にはネットワークにつながっていませんので、最初にネットワークアダプタの設定をします。

ネットワークアダプタの名前の確認

ネットワークアダプタの名前を確認します。

# nmcli d

ens33ですね。

ipアドレスの固定

キャラクタベースのGUIでipアドレスの設定ができます。

# nmtui

ens33を選択してEditを選択すると、詳細のメニューに入ります。 そこで、ip v4アドレスの設定をして、Automatically connectにチェックをしてOKします。

../../_images/vm_setup_django_02.png

ネットワークを再起動します。

# systemctl restart network.service

ipアドレスを確認してみましょう。

# ip addr

一般ユーザーの作成

vmwareのコンソールからrootでログインします。 useraddで一般ユーザーを作成し、作成したユーザーのパスワードを変更します。

# useradd hogehoge
# passwd hogehoge

公開鍵認証の設定

仮想マシンはファイアウォールの中に作りましたので、この設定はとばします。 VPSでは確実に必要な設定です。

sudoの設定

作成した一般ユーザーをwheelグループに加えます。そうすると、その一般ユーザーがsudoを使えるようになります。

# usermod -G wheel hogehoge

nanoのインストール

以降、設定ファイルの書き換えの作業が出てきます。 私は堕落した人間なので、nanoをインストールします。

# yum install nano

viも使えるようになった方が良いのかもしれないけど、別に普段サーバー管理とかしてるわけじゃないんで。

SSH接続時にrootでのログインを禁止

ルーター越しに仮想マシンに進入される可能性は低いと思いますが、自分がrootで入らないように禁止しておきます。sshd_configにPermitRootLoginという項目がありますので、行頭の#を取ってnoに変更します。

# nano /etc/ssh/sshd_config

PermitRootLogin no

SSHを再起動します。

# systemctl restart sshd.service

SSH接続時にパスワード認証を禁止

仮想マシンはファイアウォールの中に作りましたので、この設定はとばします。 VPSでは確実に必要な設定です。これをする前に、公開鍵認証の設定をする必要があります。

SSHのポート番号の変更

とりあえずポート22を狙ってくる人もいるらしいので、ポート番号を変更します。

sshd_configにPortの項目があるので、行頭の#を取って番号を変更します。

# nano /etc/ssh/sshd_config

Port 10022

仮想マシンにインストールしたCentOS7の方はSELinuxが有効になっているため、sshd_configのポート番号を変更してsshdを再起動するとエラーが出ます。 というわけで、SELinuxの設定を変更します。 さくらのVPSでは初期設定でSELinuxが無効になってるって聞いたけど、本当ですかね。

# yum install policycoreutils-python
# semanage port -a -t ssh_port_t -p tcp 10022
# semanage port -l | grep ssh
# systemctl restart sshd.service

次にファイアウォールの設定をします。 ssh.xmlをコピーしたalt-ssh.xmlの中にportの設定項目があるので、その番号を書き換えます。

# cp /usr/lib/firewalld/services/ssh.xml /usr/lib/firewalld/services/alt-ssh.xml
# nano /usr/lib/firewalld/services/alt-ssh.xml

ファイアウォールにサービスを追加してリロードします。

# firewall-cmd --add-service=alt-ssh
# firewall-cmd --add-service=alt-ssh --permanent
# firewall-cmd --reload

追加したポートからSSHでログインできるか試してみます。

SSHでログインできたら、22番ポートをファイアウォールでブロックします。

# firewall-cmd --remove-service=ssh --permanent
# firewall-cmd --reload

そうしたら、22番ポートからSSHでログインできないかどうか試してみます。

コンソールからログアウトして、以降はSSHでログインして作業をします。

# exit

アップデート

$ sudo yum update -y

日本語環境への変更

仮想マシンの場合はインストールの時点でユーザーは日本語環境になっていますので、作業不要です。 VPSの方は英語環境のようです。

# localectl set-locale LANG=ja_JP.utf8
# localectl

Apacheのインストール

yumでhttpdをインストールします。

$ sudo yum install httpd -y

日本語のファイルを扱えるようにするためにhttpdの設定をLANG=CからLANG=ja_JP.utf8に書き換えます。

$ sudo nano /etc/sysconfig/httpd

AddDefaultCharset UTF-8をコメントアウト(行頭に#を追加)します。

$ sudo nano /etc/httpd/conf/httpd.conf

ファイアウォールの設定をします。 ネコでもわかる!さくらのVPS講座 ~第三回「Apacheをインストールしよう」 を参考にします。

$ sudo firewall-cmd --add-service=http --zone=public --permanent
$ sudo firewall-cmd --add-service=https --zone=public --permanent
$ sudo firewall-cmd --reload

上から順に、ファイアウォールへのhttpの設定、httpsの設定、ファイアウォールのリロードです。

Apacheを起動します。startが起動、enableでシステム起動時に自動的にApacheが起動するようになります。statusは作動状態の表示です。activeと表示されるはずです。

$ sudo systemctl start httpd.service
$ sudo systemctl enable httpd.service
$ sudo systemctl status httpd.service

ブラウザに仮想マシンのアドレスを入れてアクセスすると、Apacheの初期画面が表示されます。

Python3をyumでインストール

yumでPython3.6をインストールします。

公式レポジトリにはPython3.6が無いので、レポジトリを追加します。

$ sudo yum install -y https://centos7.iuscommuity.org/ius-release.rpm

Python3.6とパッケージをいくつかインストールします。

$ sudo yum install -y python36u python36u-devel python36u-libs python36u-pip python36u-setuptools python36u-tools python36u-tkinter

バージョンを確認してみます。

$ which python
/usr/bin/python
$ python -V
Python 2.7.5
$ which python3.6
/usr/bin/python3.6
$ python3.6 -V
Python 3.6.4
$ which pip3.6
/usr/bin/pip3.6
$ pip3.6 -V
pip 9.0.1 from /usr/lib/python3.6/site-packages (python 3.6)

最初に入っているPythonは2.7.5で、yumで入れたPythonは3.6.4です。pipはPython 2.7.5の方には入っていません。

開発ツールのインストール

使うかどうかは別にして、いくつかツールをインストールしておきます。

$ sudo yum install -y wget
$ sudo yum groupinstall "Development Tools"
$ sudo yum install -y httpd-devel
$ sudo yum install -y openssl-devel
$ sudo yum install -y sqlite-devel
$ sudo yum install -y tree

mod_wsgiのインストール

mod_wsgiをyumでインストールするとPython2用のものがインストールされます。 そこで、pipでインストールします。

$ sudo pip3.6 install mod_wsgi

mod_wsgiのインストール場所を探します。 今回はここでした。

/usr/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

mod_wsgiの設定をします。

$ sudo cat /etc/httpd/conf.d/wsgi.conf

ファイルの内容は下記のようにしました。

LoadModule wsgi_module /usr/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
WSGIDaemonProcess myapp user=hogehoge group=hogehoge
WSGIProcessGroup myapp
WSGISocketPrefix /var/run/wsgi
WSGIScriptAlias /hello /home/hogehoge/www/wsgi/hello.py
<Directory /home/hogehoge/www/wsgi/>
    Options ExecCGI MultiViews Indexes
    MultiViewsMatch Handlers
    AddHandler wsgi-script .py
    AddHandler wsgi-script .wsgi
    DirectoryIndex index.html index.py myapp.wsgi
    Require all granted
</Directory>

プログラム(hello.py)を/home/hogehoge/www/wsgi/に置くことにします。 ディレクトリを作って、ディレクトリの権限を755にします。apacheが読めるようにするためです。

SELinux用のコンテキストを付けます。

$ sudo chcon -R -t httpd_sys_content_t /home/hogehoge/www/wsgi
$ ls -alZ /home/hogehoge/www
drwxr-xr-x. hogehoge hogehoge unconfined_u:object_r:httpd_user_content_t:s0 .
drwxr-xr-x. hogehoge hogehoge unconfined_u:object_r:user_home_dir_t:s0 ..
drwxr-xr-x. hogehoge hogehoge unconfined_u:object_r:httpd_sys_content_t:s0 wsgi

こんな感じにhttpd_sys_content_tが付いているか確認します。 chconは一時的なものなもで、うまくいったらsemanageで設定します。

下記のようなスクリプトを作ります。

$ nano /home/hogehoge/www/wsgi/hello.py

def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')])
    return [b'hello world']

ブラウザでアクセスすると、こんな感じに表示されます。

../../_images/vm_setup_django_03.png

エラーが出る場合は、apacheのエラーログを見てみてください。

$ sudo cat /var/log/httpd/error_log

SELinuxのログは下記のようにして確認します。

$ sudo ausearch -m avc

Djangoのインストール

pipでdjangoをインストールします。

$ sudo pip3.6 install django

プロジェクトを作ってみます。

$ cd ~/www/wsgi
$ django-admin startproject mysite

~/www/wsgi/mysite/mysite/wsgi.pyというファイルができているはずです。

apacheのmod_wsgiの設定を変更します。

$sudo nano /etc/httpd/conf.d/wsgi.conf

LoadModule wsgi_module /usr/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

WSGIDaemonProcess myapp user=hogehoge group=hogehoge python-path=/home/hogehoge/www/wsgi/mysite:/usr/lib64/python3.6/site-packages
WSGIProcessGroup myapp
WSGISocketPrefix /var/run/wsgi
WSGIScriptAlias /mysite /home/hogehoge/www/wsgi/mysite/mysite/wsgi.py process-group=myapp

<Directory /home/hogehoge/www/wsgi/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

ファイルを変更したら、apacheを再起動します。

$ sudo systemctl restart httpd.service

ブラウザでアクセスすると、このようなエラーが出ます。

../../_images/vm_setup_django_04.png

djangoがエラーを返してますね。

~/www/wsgi/mysite/mysite/settings.pyの中にALLOWED_HOSTSという項目があります。そこに、サーバーのアドレスを設定します。

ALLOWED_HOSTS['192.168.*.*']

Djangoのアプリケーションを作ってみます。 今回はtestappという名前にします。

$ cd ~/www/wsgi/mysite
$ python3.6 manage.py startapp testapp

~/www/wsgi/mysite/mysite/settings.py のINSTALLED_APPSにtestappを追加します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'testapp',
]

~/www/wsgi/mysite/mysite/urls.py にアプリケーションのurls.pyを読み込むように設定します。 includeのimportの追加と、urlpatternsへの読み込み指示の追加です。

from django.contrib import admin
from django.urls import include, path

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

~/www/wsgi/mysite/testapp/urls.py というファイルを作って、中に下記のように書き込みます。 view.pyのindexを呼び出せという指示ですね。

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

~/www/wsgi/mysite/testapp/views.py を下記のように書き換えます。 Hello, world.と返すだけですね。

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world.")

そうしたら、ブラウザでアクセスしてみます。

../../_images/vm_setup_django_05.png

Djangoのアプリケーションが動きました。

その他のPythonのパッケージのインストール

Pythonのパッケージをインストールします。

$ sudo pip3.6 install scipy
$ sudo pip3.6 install numpy
$ sudo pip3.6 install matplotlib

scipyをインストールしたら、numpyも一緒にインストールされました。

公開日

広告