将django代码搭建到亚马逊AWS虚拟机的apache2上,并绑定指定域名

xiaoxiao2021-02-28  99

前提:

服务器上各软件的版本一览(部分默认已安装,部分需要自己安装)

1) 服务器是:亚马逊AWS免费版EC2

2) 服务器的操作系统是:Ubuntu 16.04

3) 服务器上安装的python版本为:python 2.7.12

4) 服务器上django版本为:django 1.9.5

5 )  服务器上apache版本为: apache 2.4.18 (Ubuntu)

6) 服务器上mysql版本为: mysql 5.7.19  

下面进入正题

1. apache2默认设置及介绍(本节可跳过)

ubuntu上apache2的配置文件在如下目录中: /etc/apache2/

有如下几个文件:

|—— apache2.conf 主配置文件,apache启动后先读取它,全局配置

|—— ports.conf  配置http的端口信息,默认是80

|—— sites-available  配置可用站点信息(域名/IP和端口),默认端口是80。该目录中默认有000-default.conf, default-ss1.conf两个站点信息。

|—— sites-enabled  已启用站点信息。先在sites-available配置,apache2 reload一下就会在site-enabled中出现

|—— mods-available 已安装模块

|—— mods-enabled  已启用模块

|—— conf-available

|—— conf-enabled

|—— magic

|—— envvars  环境变量

apache配置解决的3个问题:apache需要知道自己对应哪个域名(IP地址)?,哪个端口开放以允许客户端来访问自己(默认是80端口)?网站代码放在哪里(默认在/var/www/的html目录里)?

验证ubuntu上的apache是否能够使用的方法是,在客户端浏览器输入你的服务器IP地址,打开成功的话显示下面的画面

这个网页来自 /var/www/html/index.html。

2. 安装mod_wsgi

因为这里python的版本是2.7,所以使用如下命令安装mod_wsgi :

sudo apt-get install libapache2-mod-wsgi

3. 将网站代码拷贝到服务器里,并告诉apache放在了哪里

(1)这里把代码拷贝到 /var/www/下面,假设网站代码的工程目录为ed,结构如下:

/var/www/ed/  【文件夹,工程目录】

                  |—— ed  【文件夹,里面有settings.py和wsgi.py文件】

                  |—— edtable  【app相关文件,里面有static、media文件夹】

                  |—— manage.py  【django的管理文件】

注0,因为apache默认的网站代码放置地址是/var/www/中,如放在其他地方(/var/otherdir/),需要告诉apache你换了网站代码的位置,

需要修改文件/etc/apache2/apache2.conf中的<Directory /var/www/>为<Directory /var/otherdir/>,如下图红框:

同时,在apache2.conf中加入一行代码: ServerName localhost

4. 修改wsgi.py文件,启用wsgi

这里wsgi.py的位置是 /var/www/ed/ed/wsgi.py文件,最终代码如下:

import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ed.settings")   #设置默认环境变量,指出网站的settings文件位置 os.environ.setdefault("PYTHON_EGG_CACHE", "/tmp/.python-eggs")   #注1,设置环境变量,指出系统缓存位置 from os.path import join,dirname,abspath PROJECT_DIR = dirname(dirname(abspath(__file__))) import sys sys.path.insert(0,PROJECT_DIR) from django.core.wsgi import get_wsgi_application application = get_wsgi_application()

注1处的内容很关键,如果网站需要和mysql数据库交互,在交互的过程中,数据需要在系统中先缓存起来,需要有写缓存的地方,在ubuntu中即缓存目录,写缓存的目录必须具有写的权限,tmp就是ubuntu中默认有读、写、执行权限的目录,.python-eggs是指定的文件。如果不做这样的配置,在最终访问网站时,会出现如下的错误:

mod_wsgi (pid=3522): Target WSGI script '/var/www/ed/ed/wsgi.py' cannot be loaded as Python module. mod_wsgi (pid=3522): Exception occurred processing WSGI script '/var/www/ed/ed/wsgi.py'.

..................................................................................

 ExtractionError: Can't extract file(s) to egg cache  The following error occurred while trying to extract file(s) to the Python egg cache: Permission denied:........................

出现这个错误的原因,就是没有指定有写入权限的缓存目录。

5.  在sites-available目录中配置可用站点信息,通过指定wsgi.py的位置连接apache和django

首先,新建一个站点信息配置文件yoursite.conf,使用下面的命令:

sudo vi /etc/apache2/sites-available/yoursite.conf

然后在里面写入如下代码:

<VirtualHost *:80>    #注2,服务器开放的网络端口,默认为80     ServerName www.yoursite.com  #你的网站域名,也可以是服务器的IP地址     #ServerAlias otherdomain.com  #指向这个网站的其他域名     ServerAdmin webmaster@localhost   

    DocumentRoot /var/www/ed

    Alias /media/ /var/www/ed/edtable/media/   #指定用户上传到网站的图片视频的位置

    Alias /static/ /var/www/ed/edtable/static/  #指定存放网站静态文件(如js/css/图片)的位置

    <Directory /var/www/ed/edtable/media>    #允许网站用户上传内容         Require all granted     </Directory>     <Directory /var/www/ed/edtable/static>   #允许网站用户获取静态文件

        Require all granted     </Directory>     WSGIScriptAlias / /var/www/ed/ed/wsgi.py   #告诉apache你的网站wsgi放置位置,别忘了前面的 /

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

注2处的内容,告诉服务器开放那个端口给网络,默认是80。但是电信可能会封80端口,就需要改成其他端口了。

如果这里改成其他端口,如8001,那么同时需要修改/etc/apache2/ports.conf中侦听的端口信息,即将

Listen 80 修改为Listen 8001 ,这样,apache就知道只开放8001端口了。

PS:如果将端口设置成80以外的端口,如修改为8001,在客户端浏览器访问服务器时(即输入ip加端口***.***.***.***:8001),会出现“拒绝了连接请求”的提示,如下图。

这是因为AWS服务器的安全组设置机制,默认“入站”类型只允许http的80端口,需要新增入站类型。操作如下图所示,点击1“安全组”,出现右边的画面,

注意2处选择的组名应该是服务器当前使用的“安全组”,点击3处的编辑,添加一个如4处的规则,记得把端口设置为8001就好了。

6. 配置网站代码的setting.py文件

(1)因为sites-available指定了static、media文件,那么setting.py中需要指定他们两个的路径,代码如下:

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

MEDIA_URL = '/media/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

(2)因为sites-available指定了网站域名为www.yoursite.com,setting.py文件也需要接受这个域名,

即将里面的ALLOWED_HOSTS=[ ]修改为ALLOWED_HOSTS=['www.yoursite.com']

7. 设置目录和文件权限

网站代码中的目录和文件需要有正确的权限(目录权限为755,文件权限为644,注3),否则无法打开网站。

本文网站工程放在/var/www/下,进入该目录,即

cd /var/www/

分别输入如下命令:

sudo chmod -R 755 ed    #注3

sudo find ed -type f | xargs chmod 644   #注4

注3处命令的意思是修改目录ed及其内部文件的权限,-R代表目录下所有文件。755代表用户的权限为7,第一个5指用户组的权限为5,第二个5其他人的权限为5。数字7代表读写执行权限,理解方法是读r的权限=4,写w=2,执行x=1, 那么7=4+2+1, 5=4+1,即5代表读和执行权限。

注4处的意思是找到(find)目录ed下类型(type)为文件(f)的文件,然后给他们传入参数(xargs),修改这些文件的权限为644。

8. 关闭apache2默认站点信息,启用新站点信息

apache2启用的站点信息可以在/etc/apache2/sites-enabled/目录下看到,默认会有一个000-default.conf,也就是说,默认apache2启用这个网站。

然而,需要启动的是yoursite这个网站,也就需要第5步中新增的配置yoursite.conf生效,命令如下:

sudo a2ensite /var/www/sites-available/yoursite.conf

同时,需要停用000-default,输入如下命令即可:

sudo a2dissite /var/www/sites-available/000-default.conf

然后,输入sudo service apache2 reload 使刚刚的使用和停用命令生效。

这个时候,在sites-enabled目录下会看到yousite.conf,而000-default.conf消失了。

9. 通过域名访问网站

如果域名已经解析为你的IP地址,就可以使用域名访问网站了。

注意5,亚马逊AWS的EC2的IP地址为其对应的IPv4公有IP,但如EC2重新启动,该IP地址会改变,可以尝试使用EC2的弹性IP。

注意6,如果将apache中的默认端口改为非80端口,在域名解析的时候,需要使用“隐形URL”的记录类型来解析。

10. 其他

在配置的过程中,难免会出错。可以通过以下命令查看错误日志:

cat /var/log/apache2/error.log

转载请注明原文地址: https://www.6miu.com/read-19105.html

最新回复(0)