正文将介绍如何在Linux上配置Django + Mysql + Apache环境。我们明白,Django内置的http服务器只好工作在单线程下,做开发和调试时候是能够的,不过生产条件一般都会有多用户并发,而且django的simple HTTP server处理多量静态文件的习性太差,所以要用apache做前端。Django自带的SQLite数据库权限只依靠于文件系统,没有用户帐户的概念,那里大家应用典型的关系型数据库Mysql。看似简单的环境搭建,在实际操作进度中只怕遇到了很多的大坑,所以特意将经过记录下来,也期望对我们有小小支持。

CentOS 7.5  +  python 2.7.5  + Django 1.11.14  +  Apache 2.4.6  +  Mysql 5.7.23

网上有众多那种方法安顿的博客,不过细致讲的并不曾发觉,而且许多主意都早已比较陈旧,所以本身用比较新的条件布置了一番,中间遇到的部分难点都有详细描述,希望有同学收益。

Form:Centos6.5
django项目apache部署,and
it works!

依据Docker的Django-Mysql-Apache应用容器化

2017-05-25

Mysql的容器

Django容器化

Apache容器

<span id = “1”>

 

系统环境

环境表达

操作系统:CentOS 6.7 64-bit

Mysql的容器

</span>

Mysql有法定公布的镜像,可以直接拉取,并按要求开行一个容器。

参考:这里

1. 安装Django

Linux上我们可以直接选用pip安装Django

 

1.1  安装python(使用CentOS
7.5自带的python即可)

[root@localhost ~]# python --version
Python 2.7.5

 

1.2 
网上下载get-pip.py文件安装pip:

wget https://bootstrap.pypa.io/get-pip.py

 

1.3  pip安装django

[root@localhost ~]# pip install django
[root@localhost ~]# python
Python 2.7.5 (default, Jul 13 2018, 13:06:57)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.get_version()
'1.11.14'

 

  • 系统:CentOS 7 x64
  • Python版本:2.7.5(系统自带)
  • Apache版本:2.4.6(yum安装)
  • Django版本:1.9.7(源码安装)
  • pip版本:8.1.2(官网get-pip.py方式安装)

安装基础环境

yum -y install gcc make wget

启动一个器皿

docker run --name mysql-container -v /root/mysql_datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql/mysql-server:5.7

开行一个5.7本子的Mysql容器,环境变量MYSQL_ROOT_PASSWORD表示superuser的密码,挂载宿主机的目录作为容器Mysql的数量存储目录。假设是第一回运行,Docker会发现地面没有Mysql镜像,会进展相应的依赖的拉取,随机启动容器。

澳门金沙国际 1

docker_run_mysql

docker ps -al

澳门金沙国际 2

docker_ps_al

可以寓目,mysql的器皿仍然暴光3306端口。

2. 安装Apache

Linux上使用yum安装Apache即可

[root@localhost ~]# yum install httpd
[root@localhost ~]# httpd -V
[Thu Aug 16 20:57:04.487586 2018] [so:warn] [pid 1605] AH01574: module wsgi_module is already loaded, skipping
Server version: Apache/2.4.6 (CentOS)
Server built:   Jun 27 2018 13:48:59
Server's Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)

Apache应用容器化。留意:使用yum安装的httpd,其安装目录位于/etc/httpd/,大家只须求配置/etc/httpd/conf/httpd.conf即可

 


安装Python

安装Python

yum -y install zlib-devel openssl-devel
wget https://www.Python.org/ftp/python/2.7.12/Python-2.7.12.tgz
tar xzf Python-2.7.12.tgz
cd Python-2.7.12/
./configure --prefix=/usr/local/python CFLAGS=-fPIC
make && make install
cd ../

备注:不设置zlib-devel的话,在安装setuptools时会报错。不安装openssl-devel的话,在装置django时会报错。不加CFLAGS=-fPIC参数,安装mod_wsgi时会报错。

将Python参加环境变量

在/etc/profile文件末尾添加以下内容:

export PATH=/usr/local/python/bin:$PATH

接下来使配置文件生效:

. /etc/profile

安装setuptools

wget https://pypi.python.org/packages/6b/dd/a7de8caeeffab76bacf56972b3f090c12e0ae6932245abbce706690a6436/setuptools-28.3.0.tar.gz
tar xzf setuptools-28.3.0.tar.gz
cd setuptools-28.3.0/
python setup.py install
cd ../

安装pip

wget https://pypi.python.org/packages/e7/a8/7556133689add8d1a54c0b14aeff0acb03c64707ce100ecd53934da1aa13/pip-8.1.2.tar.gz
tar xzf pip-8.1.2.tar.gz
cd pip-8.1.2/
python setup.py install
cd ../

紧接容器

docker exec -it mysql-container mysql -uroot -proot

澳门金沙国际 3

access_mysql_docker

打响联网mysql容器,创设成功。

3. 安装Mysql

大家使用yum安装Mysql,要求先更新yum源

 

[root@localhost ~]# wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
[root@localhost ~]# rpm -ivh mysql57-community-release-el7-8.noarch.rpm
[root@localhost ~]# yum install mysql-community-server
[root@localhost ~]# yum install mysql-community-devel

 

小心:yum安装的Mysql其文件目录如下

  • 配备文件:/etc/my.cnf
  • 日记文件:/var/log/mysqld.log
  • 服务启动脚本:/usr/lib/systemd/system/mysqld.service
  • socket文件:/var/run/mysqld/mysqld.pid

 

设置使用Apache作为利用代理服务器

安装Apache

安装apr

wget http://apache.fayea.com/apr/apr-1.5.2.tar.bz2
tar xjf apr-1.5.2.tar.bz2
cd apr-1.5.2/
./configure
make && make install
cd ../

安装apr-util

wget http://apache.fayea.com/apr/apr-util-1.5.4.tar.bz2
tar xjf apr-util-1.5.4.tar.bz2
cd apr-util-1.5.4/
./configure --with-apr=/usr/local/apr/
make && make install
cd ../

安装pcre

yum -y install gcc-c++
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.bz2
tar xjf pcre-8.39.tar.bz2
cd pcre-8.39/
./configure --prefix=/usr/local/pcre
make && make install
cd ../

备注:不安装gcc-c++的话会报错。

安装httpd

yum -y install perl
wget http://apache.fayea.com/httpd/httpd-2.4.25.tar.bz2
tar xjf httpd-2.4.25.tar.bz2
cd httpd-2.4.25.tar.bz2/
./configure --prefix=/usr/local/httpd --with-pcre=/usr/local/pcre
make && make install
cd ../

备注:不安装perl的话,安装mod_wsgi时会报错。

将Apache参加环境变量

在/etc/profile文件末尾添加以下内容:

export PATH=/usr/local/httpd/bin:$PATH

下一场使配置文件生效:

. /etc/profile

安装mod_wsgi

wget https://pypi.python.org/packages/28/a7/de0dd1f4fae5b2ace921042071ae8563ce47dac475b332e288bc1d773e8d/mod_wsgi-4.5.7.tar.gz
tar xzf mod_wsgi-4.5.7.tar.gz
cd mod_wsgi-4.5.7/
./configure --with-apxs=/usr/local/httpd/bin/apxs --with-python=/usr/local/python/bin/python
make && make install
chmod 755 /usr/local/httpd/modules/mod_wsgi.so
cd ../

只顾:安装是借使报错error while loading shared
libraries:libpython2.7.so.1.0:,须要再行编译安装python并添加–enable-shared参数,安装完未来python可能无法运用,需求在/etc/ld.so.conf中投入新行/usr/local/lib,保存后,运行
/sbin/ldconfig,运行/sbin/ldconfig –v查看

查看Mysql的日志

容器的Mysql日志存储在/var/log/mysqld.log下

4. 配置(重点)

如上三步都格外容易,不过将那多少个环境布署好,照旧费了自我许多的时刻…

4.1  配置Mysql

 

[root@localhost ~]# systemctl start mysqld
# 开启Mysql服务后,会为root设置一个默认密码,我们首先重置密码
# 获得默认密码
[root@localhost ~]# cat /var/log/mysqld.log | grep -i password
[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.23 MySQL Community Server (GPL)

mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY 'Sam_tech_0912';

# 重置密码后,我们创建一个数据库,因为后续django连接Mysql时需要输入数据库名称
mysql> create database Platform default charset=utf8;
Query OK, 1 row affected (0.00 sec)

mysql> quit
Bye

  

4.2  django中配置Mysql

 

django中关于Mysql的配置:

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'Platform',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': 'Sam_tech_0912',
    }
}

 

django中其余的一对的陈设:

DEBUG = True

ALLOWED_HOSTS = ["*",]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(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 = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = True

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]

MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")

补充:

关于 Error loading MySQLdb module: No module named MySQLdb

–> yum install MySQL-python

 

4.3  配置Apache

 

重点:安装mod_wsgi

[root@localhost ~]# yum install mod_wsgi
[root@localhost ~]# rpm -qa | grep wsgi
mod_wsgi-3.4-12.el7_0.x86_64

 

编辑配置文件 /etc/httpd/conf/httpd.conf

ServerRoot "/etc/httpd"

# 设定Apache监听的端口号,可以设定多个
Listen 80

# 重点:这句是加载刚刚安装的wsgi模块,有了它django才能部署到Apache上,切记!!!
LoadModule wsgi_module modules/mod_wsgi.so


Include conf.modules.d/*.conf

User apache
Group apache

ServerAdmin root@localhost

ServerName localhost:80

<Directory />
    AllowOverride none
    Require all denied
</Directory>

    DocumentRoot "/var/www/html"

<Directory "/var/www">
    AllowOverride None
    Require all granted
</Directory>

<Directory "/var/www/html">
    Options Indexes FollowSymLinks

    AllowOverride None

    Require all granted
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

<Files ".ht*">
    Require all denied
</Files>

ErrorLog "logs/error_log"

LogLevel warn

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    CustomLog "logs/access_log" combined
</IfModule>

<IfModule alias_module>

    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

</IfModule>

<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

<IfModule mime_module>
    TypesConfig /etc/mime.types

    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz



    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>

AddDefaultCharset UTF-8

<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>


EnableSendfile on

IncludeOptional conf.d/*.conf

# 我们在/etc/httpd/conf/下新建httpd-vhosts.conf虚拟主机配置文件,完成对80端口的配置
# 这句是告诉Apache去调用httpd-vhosts.conf
# 虚拟主机中的配置参数将覆盖httpd.conf主配置文件中的设定
Include conf/httpd-vhosts.conf

 

虚拟主机配置文件(最主要一步

<VirtualHost *:80>
    ServerAdmin samliuming@aliyun.com
    DocumentRoot "/home/python_projects/Platform"
    ServerName samlinux01-platform.com
    ServerAlias sam-platform.com
    ErrorLog "logs/platform_error.log"
    CustomLog "logs/platform_access.log" common


    WSGIScriptAlias / "/home/python_projects/Platform/Platform/wsgi.py"
    # 一定要定义python-path到项目目录,否则会报出相关模块无法找到的错误,切记!!!
    WSGIDaemonProcess samlinux01-platform.com python-path=/home/python_projects/Platform:/usr/lib64/python2.7/site-packages
    WSGIProcessGroup samlinux01-platform.com
    WSGIScriptReloading On

    # 设定Apache访问django的项目目录

    Alias /static /home/python_projects/Platform/static
    Alias /media /home/python_projects/Platform/media
  # 注意:将python中django admin的静态文件链接到static目录下,否则会出现登录django admin静态文件404的问题
  # ln -s /usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin admin


    <Directory /home/python_projects/Platform/media>
        AllowOverride None
        Options Indexes FollowSymLinks
        Require all granted
    </Directory>
    <Directory /home/python_projects/Platform/static>
        AllowOverride None
        Options Indexes FollowSymLinks
        Require all granted
    </Directory>
    <Directory /home/python_projects/Platform/Platform>
        <Files wsgi.py>
            AllowOverride None
            Require all granted
        </Files>
    </Directory>
</VirtualHost>

留神:每一趟编辑达成后都亟需重启httpd服务使配置生效

[root@localhost ~]# httpd -t
[Thu Aug 16 20:35:06.439115 2018] [so:warn] [pid 1520] AH01574: module wsgi_module is already loaded, skipping
Syntax OK
[root@localhost ~]# systemctl restart httpd.service

 

编辑django中的 wsgi.py文件

"""
WSGI config for Platform project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Platform.settings")

application = get_wsgi_application()

# 添加项目路径到python的环境变量中
# For Apache server
import sys
project_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, project_dir)

 

  • 安装Apache

安装Django

wget https://pypi.python.org/packages/8a/09/46f790104abca7eb93786139d3adde9366b1afd59a77b583a1f310dc8cbd/Django-1.10.2-py2.py3-none-any.whl
pip install Django-1.10.2-py2.py3-none-any.whl

安装MySQLdb(选做)

yum -y install mysql-devel
pip install MySQL-python

备注:因为自个儿的Django程序用的是MySQL数据库,所以自身急需设置这几个包。

挂载宿主机目录作为Mysql的贮存路径,并映射宿主机端口到容器外部端口

docker run --name mysql-container -p 3307:3306 -v /root/mysql_datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql/mysql-server:5.7

将/root/mysql_datadir目录挂载进/var/lib/mysql作为数据库存储文件。映射宿主机3307端口到容器3306端口。容器启动后,mysql_datadir目录下会时有发生新文件

澳门金沙国际 4

mysql_datadir

注意: 宿主机的目录必需求是相对路径

当容器宕掉后,被排除后。重新起动一个Mysql容器,并挂载 mysql_datadir
作为数据库存储路劲时,记得忽略MYSQL_ROOT_PASSWORD环境变量的安装。先前存在的数据库文件不会有转变。

奇迹由于SElinux,读写目录会有冲突,敲入以下命令

chcon -Rt svirt_sandbox_file_t /root/mysql_datadir

时于今日,旗开得胜,大家一向可以经过80端口访问大家的种类,即使上边的步子省略,然而网上查的素材并从未专门详细完整的,中间依旧走了众多的弯路,所以特地将配置步骤记录下来,方便后续再次布置!

 

配置Django

将你付出好的Django程序上传播服务器,我那边上流传/wwwroot/目录,下边这几个树形图就是本人的Django程序的构造:

这其中有个文件特别重大,能或不能健康运作就看它了,它就是wsgi.py,上边是我的文件的情节,供读者参考:

import sys

sys.path.append('/wwwroot/OMMS')

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "OMMS.settings")

application = get_wsgi_application()

专注:前两句需求本身充足,固然没有这两句,你的次第就不能正常运作了,后边的是Django自动生成的。

进去容器配置数据库权限

docker exec -it mysql-container mysql -uroot -proot

grant all privileges on *.* to 'root'@'192.168.31.182' identified by 'root' with grant option;

从192.168.31.182足以访问这些容器的mysql服务

mysql -h[hostIP] -P3307 -uroot -p

澳门金沙国际 5

access_mysql_from_romote

<span id=”2″>

# yum install httpd

配置Apache

启用虚拟主机配置文件

编辑/usr/local/httpd/conf/httpd.conf文件,
在一堆以LoadModule开始的段落下添加一行:

LoadModule wsgi_module modules/mod_wsgi.so

接下来在终极添加以下内容:

<VirtualHost *:80>
    DocumentRoot "/wwwroot/OMMS/OMMS"
    WSGIScriptAlias / "/wwwroot/OMMS/OMMS/wsgi.py"

    <Directory "/wwwroot/OMMS/OMMS">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

瞩目:读者请依照本身的先后修改其中的不二法门。

Django容器化

</span>

  • 设置Apache服务开机自启动(可选,可是设置自启动方便)

启动Web服务并测试

经过以下命令启动Apache服务:

apachectl start

从DockerHub上拉取Django镜像

docker pull library/Django:1.10.4-python3

亟需拭目以待一段时间

澳门金沙国际 6

docker_pull

以此镜像已经配备好了python3.4和django1.10的条件。未来我们还要营造可以接连mysql的环境。

mark

运转了命令yum -y install gcc make
结果出来一些错误新闻的唤醒!yum错误:Cannot retrieve repository metadata
(repomd.xml) for rpmforge 原来是自家的yum源地址该更新了!
消除办法如下:

代码如下:

cd /etc/yum.repos.d
vi rpmforge.repo

===>

baseurl=http://centos.ustc.edu.cn/centos/5/os/i386/

然后

yum clean all

用Dockerfile文件营造一个镜像

新建一个Dockerfile文件,添加上面内容

澳门金沙国际 7

Dockerfile_djanog

build镜像

docker build -t [仓库和标签名称] [Dockerfile文件路径]

澳门金沙国际 8

docker_build_django

澳门金沙国际 9

docker_image_django

# /sbin/chkconfig httpd on

从镜像运行容器

docker run --name botmail --link mysql-container:db -v /root/docker_study/django_docker/botmail/:/var/www/ -p 8000:7000 -it 1015010127/botmail:v1 /bin/bash

启航一个名为botmail的容器,并且挂载代码文件到容器中,同时映射宿主机8000端口到容器的7000端口。连接MySQL的容器,并安装别名为db。

修改Django项目中的settings.py文件中的有关数据库连接的安顿

澳门金沙国际 10

docker_django_connect

注意: 同时要为当前容器的ip配置数据库权限,否则无法连接。

  • 启动Apache服务

从镜像中启动django项目

docker exec -it botmail python manage.py runserver 0.0.0.0:7000

澳门金沙国际 11

docker_run_django

担保防火墙关闭后得以从表面访问。

这么打造的Django+mysql容器连接有一对标题,首先端口7000利用了硬编码,而且数据库连接使用‘db’硬编码,应当考虑接纳docker-compose

使用docker-compose搭建MySQL+django

安装docker-compose,参考:合法安装文档

curl -L https://github.com/docker/compose/releases/download/$dockerComposeVersion/docker-compose-`uname -s\`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

创制一个索引botmail_docker,并新建一个docker-compose.yml文件,写入以下内容。

  1 # docker-compose版本
  2 version: '3'
  3 # 服务
  4 services:
  5     # 数据库服务
  6     db:
  7         # 拉取镜像
  8         image: 1015010127/mysql-server:v2
  9         # 运行容器的名称
 10         container_name: mysql-container
 11         # 环境变量文件
 12         env_file: ./db.env
 13         # 端口映射,外部可以从3308端口访问
 14         ports:
 15             - "3308:3306"
 16         # 挂载目录
 17         volumes:
 18             # 数据储存目录,请自行定义
 19             - /root/docker_study/botmail_docker/data:/var/lib/mysql
 20         # 设置工作目录
 21         working_dir: /mysql_data_init
 22     # web服务
 23     web:
 24         image: 1015010127/botmail:v1
 25         container_name: botmail
 26         # 依赖db服务,先启动db再启动web
 27         depends_on:
 28             - db
 29         # 宕机即重启
 30         restart: always
 31         # 暴露端口
 32         ports:
 33             - "8000:7000"
 34         volumes:
 35             - ./botmail:/var/www/botmail   # 代码文件
 36         working_dir: /var/www/botmail
 37         # 启动容器是运行的命令
 38         command: python manage.py runserver 0:7000
 39         # 连接数据库
 40         links:
 41             - db

创造db.env文件作为设置db服务的环境变量。

  1 # 指定root的密码
  2 MYSQL_ROOT_PASSWORD=root
  3 # 创建一个新的数据库
  4 MYSQL_DATABASE=botmail_docker
  5 # 指定某个网段的ip可以访问
  6 MYSQL_ROOT_HOST=172.%.%.%
  7 # 要挂载的数据存储位置
  8 MYSQL_VOLUME_DATADIR=/root/docker_study/botmail_docker/data
  9 # 数据库初始化数据
 10 MYSQL_INIT_DIR=/root/docker_study/botmail_docker/mysql_init/botmail_online.sql
 11 # 运行时执行的
 12 EXEC_SQL=use botmail_docker;source data_init.sql;

创办data文件夹用作db服务的多少存储,通过以下命令启动容器组合。

docker-compose up

万一data文件夹中为空,db服务会开展一些伊始化

澳门金沙国际 12

docker-compose_up

先河成功后,通过docker-compose ps可以查看运行的容器,注意:
要在docker-compose.yml文件目录下敲命令。

澳门金沙国际 13

docker-compose_ps

明天可以从宿主机的ip访问botmail应用,但因为数据库中尚无数量,需求开头化数据。

docker-compose exec db mysql -uroot -proot -e "use botmail_docker;source data_init.sql;"

data_init.sql文件已经存在在数据库容器的做事目录下。

澳门金沙国际 14

docker_init_db_data

当今得以拓展登录了。

<span id=”3″>

# /sbin/service httpd start

Apache容器

</span>

  • 证实安装

拉取centos镜像,用来搭建apache服务

澳门金沙国际 15

pull_centos

开行一个器皿,并用yum安装httpd服务

澳门金沙国际 16

run_centos

澳门金沙国际 17

yum_install_httpd

启动httpd服务报错

澳门金沙国际 18

apache_docker_start_error

本条题材可以参见前面的不当化解办法

此刻先不管那个题材

安装django环境

访问本机的80端口:http://localhost
出现以下界面说明安装成功(apache端口被我更改过成81)

安装python3

请参考源码包安装python3以及pip

访问Apache服务

pip安装django1.10以及pymysql

澳门金沙国际 19

pip_install_django_pymysql

  • Apache服务的布局表达

配置apache的python模块

主配置文件是/etc/httpd/conf/httpd.conf
其余安插文件存储在/etc/httpd/conf.d/目录

安装mod_wsgi

wsgi全称为web server gateway
interface,是web应用与服务器的接口模块,apache必须安装mod_wsgi才可以和python代码举行互动,从前有个版本用的是mod_python,现已经淘汰了

下载源码包

wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.5.15.tar.gz

解压并编译安装

解压并安装,注意提前安装gcc和httpd-devel,那是编译所不可不的倚重包,否则编译报错(apx:commmand
not found)

yum install gcc httpd-devel -y

编译安装mod_wsgi,注意指定python3的环境

澳门金沙国际 20

compile_mod_wsgi_python3

水到渠成编译安装的结果

澳门金沙国际 21

success_complie_mod_wsgi

声明模块已经设置到那些目录下了/usr/lib64/httpd/modules/mod_wsgi.so

在httpd的模块目录中得以找到

澳门金沙国际 22

got_mod_wsgi_module

卸载看重包,减小容器的体积

主配置文件内容为:

测试apache服务

凑巧蒙受了apache服务无法启动的难题,今后举办化解

退出容器,将如今容器打包成镜像

docker commit -pm "新版apache_django配置" apache 1015010127/centos:apache_v4

终极一个选项是我的docker仓库名,可以自行定义

用以下新命令运行

docker run --privileged -d --name apache -p 6003:80 1015010127/centos:apache_v4 /usr/sbin/init

澳门金沙国际 23

new_run_apache_docker

跻身容器,启动apache服务

澳门金沙国际 24

success_start_apache

经过浏览器可以访问

澳门金沙国际 25

browe_apache_welcome

6003端口是宿主机的,映射到容器的80端口

#服务器根目录
ServerRoot "/etc/httpd"

#端口
#Listen 12.34.56.78:80
Listen 80

#域名+端口来标识服务器,没有域名用ip也可以
#ServerName www.example.com:80

#不许访问根目录
<Directory />
    AllowOverride none
    Require all denied
</Directory>

# 文档目录
DocumentRoot "/var/www/html"

# 对 /var/www目录访问限制
<Directory "/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

# 对/var/www/html目录访问限制
<Directory "/var/www/html">
   Options Indexes FollowSymLinks
   AllowOverride None
   Require all granted
</Directory>

# 默认编码
AddDefaultCharset UTF-8

#EnableMMAP off
EnableSendfile on

# include进来其它配置文件

IncludeOptional conf.d/*.conf

修改httpd.conf文件

增加以下两行

导入wsgi模块

LoadModule wsgi_module modules/mod_wsgi.so

django项目路线

WSGIPythonPath /var/www/botmail

python3的设置路径

WSGIPythonHome /usr/python3.5

  • 配备须求小心的点

澳门金沙国际,布置虚拟主机

在/etc/httpd/conf.d/目录下新建一个文书botmail.conf,添加以下内容

<VirtualHost *:80>
WSGIScriptAlias / /var/www/botmail/botmail/wsgi.py
#WSGIPythonPath /var/www/botmail
#WSGIPythonHome /usr/python3.5
Alias /media/ /var/www/botmail/media/
Alias /static/ /var/www/botmail/html/dist/static/

<Directory /var/www/botmail/media>
Require all granted
</Directory>

<Directory /var/www/botmail/html/dist/static/>
Require all granted
</Directory>

<Directory /var/www/botmail/botmail>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

</VirtualHost>

注意:
不要在虚拟主机的配备文件中陈设WSGIPythonPath和WSGIPythonHome,否则启动apachectl服务时报错

因为是首先次接触apache服务器,这里的配置具体意思我不是特别了然,有趣味应该查阅官方文档。

再度起动apache服务,没错误的话就ok

apachectl restart

双重将那么些容器打包一份镜像

到现在就剩最终一步了:挂载botmail的门类路线

Apache2.2.x版本和Apache2.4.x版本对于Directory标签中的配置方式并不均等,倘使布置格局不当
会导致 client denied by server configuration错误

透过docker-compose.yml文件打造容器组合

创建一个docker-compose.yml文件,填入以下内容

# docker-compose版本
version: '3'
# 服务
services:
    # 数据库服务
    db:
        # 拉取镜像
        image: 1015010127/mysql-server:v2
        # 运行容器的名称
        container_name: mysql-container
        # 环境变量文件
        env_file: ./db.env
        # 端口映射,外部可以从3308端口访问
        ports:
            - "3308:3306"
        # 挂载目录
        volumes:
            # 数据储存目录,请自行定义
            - /root/docker_study/botmail_docker/data:/var/lib/mysql
        # 设置工作目录
        working_dir: /mysql_data_init
    # web服务
    web:
        image: 1015010127/centos:apache_v5
        container_name: botmail_apache
        # 依赖db服务,先启动db再启动web
        depends_on:
            - db
        # 宕机即重启
        restart: always
        # 暴露端口
        ports:
            - "8000:7000"
            - "6001:80"
        volumes:
            - /root/docker_study/botmail_docker/botmail:/var/www/botmail
        working_dir: /var/www/botmail

        command: /usr/sbin/init

        privileged: true
        # 连接数据库
        links:
            - db

在这一个文件的目录下运作以下命令

docker-compose up

澳门金沙国际 26

docker-compose_run_apache_mysql

在浏览器上访问6001端口,即可看出你的django项目

澳门金沙国际 27

web_docker_botmail

Apache2.2.x的布局文件(IP地址以192.168.10.81为例)

只怕会碰着的谬误

<VirtualHost 192.168.10.81:80>
ServerAdmin rocdk890@gmail.com
directoryIndex  index.html index.php index.htm index.shtml login.php
ServerName 192.168.10.81
DocumentRoot /var/www/vhosts/wwwroot
<Directory "/var/www/vhosts/wwwroot">
    Options -Indexes
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>
</VirtualHost>

apache配置错误

<span id=4>

Apache2.4.x的布局文件

1. 在centos7镜像中安装httpd服务,启动报错

</span>

澳门金沙国际 28

centos_docker_httpd_error

装进当前容器,成镜像,然后从新用以下命令运行

docker run --privileged -d --name apache -p 6003:80 1015010127/centos:apache_v4 /usr/sbin/init

澳门金沙国际 29

new_run_apache_docker

跻身容器,启动apache服务

澳门金沙国际 30

success_start_apache

通过浏览器可以访问

澳门金沙国际 31

browe_apache_welcome

6003端口是宿主机的,映射到容器的80端口

随后进入容器内启动apache可以成功

<VirtualHost 192.168.10.81:80>
ServerAdmin rocdk890@gmail.com
directoryIndex  index.html index.php index.htm index.shtml login.php
ServerName 192.168.10.81
DocumentRoot /var/www/vhosts/wwwroot
<Directory "/var/www/vhosts/wwwroot">
    Options -Indexes
    AllowOverride All
    Require all granted
</Directory>
</VirtualHost>

2. apache的python环境安排错误

因为python项目是用python3写的,大家都精通python3和python2是不般配的,假使apache的是python2条件,如下,启动时通过翻看/var/log/httpd/error_log日志可以查阅apache启动的安插新闻

澳门金沙国际 32

python_2.7.5_configure

走访web应用时,后端的python代码报错

澳门金沙国际 33

python_run_2.7.5_error

python2的模块和python3并不匹配

在httpd/conf/httpd.conf添加Python3的安装目录,来指定使用python3的条件

澳门金沙国际 34

add_python3_home

不过在运转的时候却现身没有site模块的不当:ImportError: No module named
site

澳门金沙国际 35

python3_no_module_site

距今查阅wsgi是还是不是安排不错,/etc/httpd/modules/mod_wsgi模块的看重

ldd mod_wsgi.so

澳门金沙国际 36

mod_wsgi_python2

依赖的python竟然是python2,因而考虑采纳python3条件编译mod_wsgi模块

下载源码包

wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.5.15.tar.gz

解压并设置,注意体检安装gcc和httpd-devel,那是编译所必须的倚重性包,否则编译报错

yum install gcc httpd-devel -y

编译安装mod_wsgi,注意指定python3的环境

澳门金沙国际 37

compile_mod_wsgi_python3

发出错误:relocation R_X86_64_32S against
`_Py_NotImplementedStruct’ can not be used when making a shared
object; recompile with -fPIC

/usr/python3.5/lib/libpython3.5m.a: error adding symbols: Bad value

collect2: error: ld returned 1 exit status

apxs:Error: Command failed with rc=65536

make: *** [src/server/mod_wsgi.la] Error 1

澳门金沙国际 38

这几个破绽百出的消除办法是要重新编译python3的源码,并丰硕–enable-shared选项

./configure --prefix=[python3的目录] --enable-shared

兴许再度编译python后,运行python3的相互命令是,暴发以下错误,爱戴爆发难点

澳门金沙国际 39

python_lib_cannot_find

经过复制python3索引下lib/libpython3.5m.so.1.0到/lib64/libpython3.5m.so.1.0可以缓解

此刻,可以正常编译mod_wsgi,且httpd/module/mod_wsgi.so着重如下

澳门金沙国际 40

mod_wsgi_python3

注意:
重新编译了python源码,可能会导致增加模块的丢失,注意重新用pip安装

python -m pip install [扩展模块名称]==[版本]

变更地点首要有:

web界面突显Not Found

Not Found

The requested URL / was not found on this server.

澳门金沙国际 41

not_found_error

想必是django的种类路线没有安插对

删除了 Order deny,allow 和 Order allow,deny
把 Deny from all 替换成了 Require all denied
把Allow from all 替换成了 Require all granted
然后还把 Allow from 192.168.10.21 这样的语句给替换成了 Require host 192.168.10.21

使用mod_wsgi拓展作为Django的行使容器

  • 首先安装httpd-devel

# yum install -y httpd-devel
  • 安装mod__wsgi

# yum install mod_wsgi

设置到位将来,mod_wsgi.so会在Apache的modules目录中

  • 在httpd.conf文件中添加以下内容

LoadModule  wsgi_module modules/mod_wsgi.so

该配置用来两次三番django.wsgi,使工程被Apache加载

品种根目录中新建wsgi文件夹,在wsgi文件夹中新建文件 django.wsgi

  • django.wsgi文件内容如下:

import os
import sys
from django.core.wsgi import get_wsgi_application

# Add this file path to sys.path in order to import settings
sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), '..'))

os.environ['DJANGO_SETTINGS_MODULE'] = 'projectname.settings'

sys.stdout = sys.stderr

DEBUG = True

application = get_wsgi_application()

瞩目:对于1.3和1.4及现在的版本,此文件的代码内容是例外的,详情分化参考
http://django.readthedocs.io/en/latest/releases/1.7.html\#standalone-scripts

配置wsgi时,

总得配备项目路线到系统路径中,因为要因此品种路线找到settings.py配置文件。约等于sys.path.insert(0,
os.path.join(os.path……巴拉巴拉,DJANGO_SETTINGS_MODULE总得指向项目标settings.py文件,projectname指的就是类其余称号。
修改了wsgi的布置后务必重启httpd服务。

在Apache中配置wsgi

  • 在httpd.conf中添加一行

WSGIScriptAlias /python "/path/to/docRoot/django.wsgi" 

如:WSGIScriptAlias /python /usr/local/testProject/wsgi/django.wsgi

设置项目目录访问权限

在httpd.conf中添加目录权限,否则会报错:Apache: access denied because
search permissions are missing

<Directory "/usr/local/testProject">
  AllowOverride All
  Require all granted
</Directory>

安装Django

# wget https://www.djangoproject.com/m/releases/1.9/Django-1.9.7.tar.gz
# cd Django-1.9.7/
# python setup.py install
  • 证实Django安装是或不是成功

# python
>>> import django
>>> django.VERSION
(1,9,7,'final',0)

安装pip

# wget https://bootstrap.pypa.io/get-pip.py
# python get-pip.py

设置MySQLdb模块(常用模块安装)

# yum install python-devel
# yum install mysql-devel
# pip install MySQL-python

末尾访问项目标听从(此前做的一个小品种哈,表介意界面)

配置形成之后拜访项目

下一步改良格局

接纳Docker技术,把Django计划环境制作成镜像,然后在生养服务器上安装Docker环境,项目的翻新直接更新镜像即可,了然Docker技术到https://www.gitbook.com/book/yeasy/docker\_practice/details,生产条件使用镜像的计划方式,就可防止止环境重复配置的题材,而且不少服务器使用的CentOS版本依旧6.x,然后自带的python版本较低,升级python版本又相比费心,Docker在生育环境已经在广泛应用了。

相关文章