Apache应用容器化
分类:pc28.am神测网

 

本文将介绍如何在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
  • 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)

注意:使用yum安装的httpd,其安装目录位于/etc/httpd/,我们只需要配置/etc/httpd/conf/httpd.conf即可

 

安装使用Apache作为应用代理服务器

安装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)

 

安装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端口访问我们的项目,虽然上面的步骤简单,但是网上查的资料并没有特别详细完整的,中间还是走了不少的弯路,所以特意将配置步骤记录下来,方便后续再次配置!

 

# yum install httpd

配置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">

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

配置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>

启动Web服务并测试

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

apachectl start

从DockerHub上拉取Django镜像

docker pull library/Django:1.10.4-python3

需要等待一段时间

图片 6

docker_pull

这个镜像已经配置好了python3.4和django1.10的环境。现在我们还要构建可以连接mysql的环境。

# /sbin/chkconfig httpd on

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

  • 启动Apache服务

从镜像运行容器

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配置数据库权限,否则无法连接。

从镜像中启动django项目

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

图片 11

docker_run_django

确保防火墙关闭后可以从外部访问。

这样构建的Django mysql容器连接有一些问题,首先端口7000使用了硬编码,而且数据库连接使用‘db’硬编码,应当考虑使用docker-compose

# /sbin/service httpd start

使用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">

  • 验证安装

Apache容器

</span>

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

图片 15

pull_centos

启动一个容器,并用yum安装httpd服务

图片 16

run_centos

图片 17

yum_install_httpd

启动httpd服务报错

图片 18

apache_docker_start_error

这个问题可以参考后面的错误解决办法

此时先不管这个问题

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

安装django环境

图片 19访问Apache服务

安装python3

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

  • Apache服务的配置说明

pip安装django1.10以及pymysql

图片 20

pip_install_django_pymysql

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

配置apache的python模块

主配置文件内容为:

安装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的环境

图片 21

compile_mod_wsgi_python3

成功编译安装的结果

图片 22

success_complie_mod_wsgi

说明模块已经安装到这个目录下了/usr/lib64/httpd/modules/mod_wsgi.so

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

图片 23

got_mod_wsgi_module

卸载依赖包,减小容器的体积

#服务器根目录ServerRoot "/etc/httpd"#端口#Listen 12.34.56.78:80Listen 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 offEnableSendfile on# include进来其它配置文件IncludeOptional conf.d/*.conf

测试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

图片 24

new_run_apache_docker

进入容器,启动apache服务

图片 25

success_start_apache

通过浏览器可以访问

图片 26

browe_apache_welcome

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

  • 配置需要注意的点

修改httpd.conf文件

添加以下两行

导入wsgi模块

LoadModule wsgi_module modules/mod_wsgi.so

django项目路径

WSGIPythonPath /var/www/botmail

python3的安装路径

WSGIPythonHome /usr/python3.5

Apache2.2.x版本和Apache2.4.x版本对于Directory标签中的配置方式并不一样,如果配置方式错误会导致 client denied by server configuration错误

配置虚拟主机

在/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的配置文件(IP地址以192.168.10.81为例)

通过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

图片 27

docker-compose_run_apache_mysql

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

图片 28

web_docker_botmail

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

可能会遇到的错误

Apache2.4.x的配置文件

apache配置错误

<span id=4>

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

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

</span>

图片 29

centos_docker_httpd_error

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

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

图片 30

new_run_apache_docker

进入容器,启动apache服务

图片 31

success_start_apache

通过浏览器可以访问

图片 32

browe_apache_welcome

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

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

变动地方主要有:

2. apache的python环境配置错误

因为python项目是用python3写的,我们都知道python3和python2是不兼容的,如果apache的是python2环境,如下,启动时通过查看/var/log/httpd/error_log日志可以查看apache启动的配置信息

图片 33

python_2.7.5_configure

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

图片 34

python_run_2.7.5_error

python2的模块和python3并不兼容

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

图片 35

add_python3_home

但是在运行的时候却出现没有site模块的错误:ImportError: No module named site

图片 36

python3_no_module_site

现在查看wsgi是否配置正确,/etc/httpd/modules/mod_wsgi模块的依赖

ldd mod_wsgi.so

图片 37

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的环境

图片 38

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

图片 39

这个错误的解决办法是要重新编译python3的源码,并加上--enable-shared选项

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

可能重新编译python后,运行python3的交互命令是,发生以下错误,依赖发生问题

图片 40

python_lib_cannot_find

通过复制python3目录下lib/libpython3.5m.so.1.0到/lib64/libpython3.5m.so.1.0可以解决

此时,可以正常编译mod_wsgi,且httpd/module/mod_wsgi.so依赖如下

图片 41

mod_wsgi_python3

注意: 重新编译了python源码,可能会造成扩展模块的丢失,注意重新用pip安装

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

删除了 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

web界面显示Not Found

Not Found

The requested URL / was not found on this server.

图片 42

not_found_error

可能是django的项目路径没有配置对

使用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 osimport sysfrom django.core.wsgi import get_wsgi_application# Add this file path to sys.path in order to import settingssys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath), '..'))os.environ['DJANGO_SETTINGS_MODULE'] = 'projectname.settings'sys.stdout = sys.stderrDEBUG = Trueapplication = get_wsgi_application()

注意:对于1.3和1.4及之后的版本,此文件的代码内容是不同的,详情区别参考

配置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

最后访问项目的效果(之前做的一个小项目哈,表介意界面)

图片 43部署完成之后访问项目

下一步改进方法

使用Docker技术,把Django部署环境制作成镜像,然后在生产服务器上安装Docker环境,项目的更新直接更新镜像即可,了解Docker技术到

本文由pc28.am发布于pc28.am神测网,转载请注明出处:Apache应用容器化

上一篇:加上局地注释 下一篇:win10关机指示灯亮解决办法,笔记本win10关机异常
猜你喜欢
热门排行
精彩图文
  • win10关机指示灯亮解决办法,笔记本win10关机异常
    win10关机指示灯亮解决办法,笔记本win10关机异常
         新上市的win10,我们都急急的装上了,可是却遇上了数不清主题素材。 自打使用了win10今后,作者已经忍不住的爱上了他——迄今截至最NB的windows系统
  • 加上局地注释
    加上局地注释
    本文稍作改动,添加部分说明,原文链接: 使用vmware安装CentOS7,vmware安装centos7 1.先创建一个文件夹用以存放镜像   2.运行vmware,点击创建新的虚拟机  
  • 的大概介绍及安装
    的大概介绍及安装
        WSL,Windows Subsystemfor Linux,正是事先的Bash on [Ubuntu on]Windows(嗯,微软改名部KPI ),在wsl意况下大家能够运营一些Linux程序。     首先要说一句,其实
  • 退出vi编辑格局,vi编辑命令
    退出vi编辑格局,vi编辑命令
    CentOS 7 vi编辑命令 用vi张开叁个yum文件 vi /usr/bin/yum 按 i 键后  走入insert格局,进入insert情势后手艺拓展更换 修改达成后 按esc键进入command模式, 然后:wq
  • 关于打开新窗口同时关闭原窗口出现的问题,G
    关于打开新窗口同时关闭原窗口出现的问题,G
    Ctrl c:复制 v:粘贴 z:撤销 a:全选 关于打开新窗口同时关闭原窗口出现的问题 三个窗口间,点击第一个窗口的按钮,打开第二个窗口,同时关闭第一个窗口,在