Python
Django
MySQL
nginx
CentOS

[環境構築] Python3.6+Django2+nginx1.15+MySQL8のlocal環境をCentOS7.5で作る

はじめに

これは私がPythonを勉強するために環境構築を行なった時の記録です。
この手順通りに作業すれば土台となる環境が構築されるはずです。
(何回か検証をしたので大丈夫だとは思います。)
あくまでもlocal環境の構築手順です。

環境に関して

私が下記の手順で環境構築したときの各ソフトウェアやOSの情報

Host OS side

  • OS
    • windows10
  • その他
    • Oracle VM VirtualBox 5.2.12

Guest OS side

  • OS
    • CentOS7.5
  • 言語
    • Python3.6.5
  • フレームワーク
    • Django2.0.7
  • web server
    • Nginx1.15.1
  • DB
    • MySQL 8.0.11

環境構築の手順

VirtualBoxにCentOS7をinstall

Oracle VM VirtualBoxのポートフォワーディング

設定 > ネットワーク > アダプター 1 > 高度 > ポートフォワーディング
capture_port_setting.png

SELinuxを無効にする

$ sudo vi /etc/selinux/config
$ sudo shutdown -r now
---
# SELINUXの設定を無効にする
SELINUX=disabled
---

SELinuxを無効にする理由

nginxがconfを読むときにSELinuxが有効になっているとPermission errorが起きるため。
今回はlocal環境を作ることが目的なので無効にする。

/var/log/error.log
2018/07/22 17:46:28 [emerg] 1487#1487: open() "/etc/nginx/sites-enabled/mysite_nginx.conf" failed (13: Permission denied) in /etc/nginx/nginx.conf:32

参考

SELinuxに関して

firewallの設定

firewallの設定
$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --zone=public --add-port=8000/tcp --permanent
$ sudo firewall-cmd --reload

python3のinstall

python3.6とpipをinstall
$ sudo yum update
$ sudo yum install https://centos7.iuscommunity.org/ius-release.rpm
$ sudo yum install python36u  python36u-devel python36u-pip
$ python3.6 --version
Python 3.6.5
$ pip3.6 --version
pip 9.0.1 from /usr/lib/python3.6/site-packages (python 3.6)
$ sudo pip3.6 install --upgrade pip
$ pip3.6 --version
pip 18.0 from /usr/lib/python3.6/site-packages/pip (python 3.6)

参考

Django (installから動作確認)

Djangoのinstall
$ sudo pip3.6 install Django
$ sudo python3.6 -m django --version
2.0.7
Djangoのプロジェクトを作成
$ cd ~
$ django-admin startproject mysite
Djangoのプロジェクトの動作確認
$ python3.6 ~/mysite/manage.py migrate
$ python3.6 ~/mysite/manage.py runserver 0:8000

HostOSのwebブラウザからhttp://localhost:8000/にアクセスする。
下のような画面が表示されればOK。

capture.png

参考

nginxのinstall

nginxをinstall
$ sudo vi /etc/yum.repos.d/nginx.repo
---
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
---
$ sudo yum install nginx
$ nginx -v
nginx version: nginx/1.15.1
$ sudo systemctl enable nginx
$ sudo systemctl start nginx
$ curl localhost

HostOSのwebブラウザからhttp://localhost:8080/にアクセスする。
下のような画面が表示されればOK。
capture_nginx.png

Djangoをnginxで動かす

uwsgiをインストール
$ sudo yum install gcc
$ sudo pip3.6 install uwsgi
$ uwsgi --version 
2.0.17.1
設定
$ cd ~/mysite/
$ python3.6 manage.py startapp myapp
$ vi ~/mysite/mysite/settings.py 
---
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp', <- 追加
]
---

$ vi ~/mysite/myapp/views.py
---
from django.http import HttpResponse

def hello(request):
        return HttpResponse("Hello, Nginx.")
---

$ vi ~/mysite/myapp/urls.py
---
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.hello, name='hello'),
]
---

$ vi ~/mysite/mysite/urls.py
---
"""mysite URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^myapp/', include('myapp.urls')),
]
---

$ cp /etc/nginx/uwsgi_params ~/mysite/
$ ls -la  ~/mysite/uwsgi_params
$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled
$ sudo vi /etc/nginx/sites-available/mysite_nginx.conf
---
# the upstream component nginx needs to connect to
upstream django {
    # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
    server 127.0.0.1:8001;
}

# configuration of the server
server {
    # the port your site will be served on
    listen      8000;
    # the domain name it will serve for
    server_name 127.0.0.1;
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;

    # Django media
    location /media  {
        alias /home/xxx/mysite/media;  # 適切なパスに変更してください
    }

    location /static {
        alias /home/xxx/mysite/static; # 適切なパスに変更してください
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /home/xxx/mysite/uwsgi_params; # 適切なパスに変更してください
    }
}
---

$ cp -i /etc/nginx/sites-available/mysite_nginx.conf ~/mysite
$ sudo ln -s ~/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/
$ sudo vi /etc/nginx/nginx.conf
---
include /etc/nginx/sites-enabled/*; <-この設定がなければ追加
---

$ echo 'STATIC_ROOT = os.path.join(BASE_DIR, "static/")' >> ~/mysite/mysite/settings.py
$ python3.6 ~/mysite/manage.py collectstatic
$ sudo systemctl restart nginx
$ uwsgi --socket :8001 --module mysite.wsgi

HostOSのwebブラウザからhttp://localhost:8000/myapp/にアクセスする。
下のような画面が表示されればOK。
capture_django_nginx.png

参考

MySQL

MySQLをinstall
$ sudo rpm -Uvh http://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
$ sudo yum repolist all | grep mysql
$ sudo yum install mysql-community-server
$ mysql --version
mysql  Ver 8.0.11 for Linux on x86_64 (MySQL Community Server - GPL)
$ sudo systemctl start mysqld.service
$ sudo systemctl status mysqld.service
$ sudo systemctl is-enabled mysqld.service
MySQLにloginできるか確認
$ grep 'temporary password' /var/log/mysqld.log
$ mysql -u root -p

参考

おわりに

私はPythonを勉強し始めたばかりなので、知見のあるかたのフィードバックをお待ちしています。
もしこの記事が私のようにPythonを勉強したいと思われている方のお役に立てれば幸いです。