Apache应用容器化

By admin in 美高梅手机版4858 on 2019年2月9日

 

正文将介绍怎样在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”>

 

系统环境

Apache应用容器化。环境说明

操作系统: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镜像,会展开对应的借助的拉取,随机启动容器。

美高梅手机版4858 1

docker_run_mysql

docker ps -al

美高梅手机版4858 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即可

 


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

美高梅手机版4858 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

 

美高梅手机版4858 ,专注: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目录下会生出新文件

美高梅手机版4858 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

美高梅手机版4858 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

亟待拭目以待一段时间

美高梅手机版4858 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文件,添加上面内容

美高梅手机版4858 7

Dockerfile_djanog

build镜像

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

美高梅手机版4858 8

docker_build_django

美高梅手机版4858 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文件中的有关数据库连接的配置

美高梅手机版4858 10

docker_django_connect

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

  • 启动Apache服务

从镜像中启动django项目

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

美高梅手机版4858 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服务会开展部分先河化

美高梅手机版4858 12

docker-compose_up

启航成功后,通过docker-compose ps能够查看运行的器皿,注意:
要在docker-compose.yml文件目录下敲命令。

美高梅手机版4858 13

docker-compose_ps

明天可以从宿主机的ip访问botmail应用,但因为数据库中并未数量,必要开始化数据。

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

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

美高梅手机版4858 14

docker_init_db_data

当今可以举办登录了。

<span id=”3″>

# /sbin/service httpd start

Apache容器

</span>

  • 证实安装

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

美高梅手机版4858 15

pull_centos

起步一个容器,并用yum安装httpd服务

美高梅手机版4858 16

run_centos

美高梅手机版4858 17

yum_install_httpd

启动httpd服务报错

美高梅手机版4858 18

apache_docker_start_error

其一难点得以参考前面的不当解决办法

此时先不管那个难题

安装django环境

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

安装python3

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

访问Apache服务

pip安装django1.10以及pymysql

美高梅手机版4858 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的条件

美高梅手机版4858 20

compile_mod_wsgi_python3

打响编译安装的结果

美高梅手机版4858 21

success_complie_mod_wsgi

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

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

美高梅手机版4858 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

美高梅手机版4858 23

new_run_apache_docker

跻身容器,启动apache服务

美高梅手机版4858 24

success_start_apache

经过浏览器可以访问

美高梅手机版4858 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

美高梅手机版4858 26

docker-compose_run_apache_mysql

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

美高梅手机版4858 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>

美高梅手机版4858 28

centos_docker_httpd_error

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

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

美高梅手机版4858 29

new_run_apache_docker

进去容器,启动apache服务

美高梅手机版4858 30

success_start_apache

由此浏览器可以访问

美高梅手机版4858 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启动的布局新闻

美高梅手机版4858 32

python_2.7.5_configure

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

美高梅手机版4858 33

python_run_2.7.5_error

python2的模块和python3并不般配

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

美高梅手机版4858 34

add_python3_home

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

美高梅手机版4858 35

python3_no_module_site

前几日查阅wsgi是不是配备不错,/etc/httpd/modules/mod_wsgi模块的重视

ldd mod_wsgi.so

美高梅手机版4858 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的条件

美高梅手机版4858 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

美高梅手机版4858 38

那个指鹿为马的解决办法是要重新编译python3的源码,并丰富–enable-shared选项

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

或是再一次编译python后,运行python3的相互命令是,爆发以下错误,看重发生难点

美高梅手机版4858 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看重如下

美高梅手机版4858 40

mod_wsgi_python3

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

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

更改地点重点有:

web界面突显Not Found

Not Found

The requested URL / was not found on this server.

美高梅手机版4858 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在生养环境已经在广泛应用了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有