前提:
服务器上各软件的版本一览(部分默认已安装,部分需要自己安装)
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