ubuntu linux apache快速上手教程
web服务器搭建指南
[TOC]
apache
apache安装
yum install -y httpd # 安装apache
systemctl start httpd.service # 启动服务
systemctl enable httpd.service # 开机自动启动
默认网站路径:
/var/www/html/index.html
PHP5支持
yum -y install php # 安装PHP
systemctl restart httpd.service #重启apache,PHP才能生效
vim /var/www/html/index.php <? php phpinfo(); ?> # PHP测试
#安装PHP扩展
yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-fpm
mariadb支持
yum install mariadb-server mariadb -y
systemctl start mariadb # 启动服务
mysql_secure_installation # 设置root密码
systemctl enable mariadb # 设置开机启动
mysql -u root -p
set password for 'root'@'localhost' = password('mypasswd') # 再次演示修改root密码(请忽略)
grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;#授权远程
flush privileges; # 配置生效
apache基本配置
#>>> vim /etc/httpd/conf/httpd.conf
ServerName localhost:80
apache其他配置
禁止IP访问
#>>>vim /etc/httpd/conf.d/virtualHost.conf
<VirtualHost *:80>
ServerName 47.96.115.220
DocumentRoot "${SRVROOT}/www/error"
<Directory />
Require all denied
</Directory>
</VirtualHost>
拒绝某个IP地址访问
#>>> vim /etc/httpd/conf/httpd.conf
<Directory "/var/www">
AllowOverride None
# Allow open access:
<RequireAll>
Require all granted
Require not ip 107.181.189.83
Require not ip 221.234.159.93
</RequireAll>
#Require all granted
</Directory>
python mod_wsgi支持
mod_wsgi工作流程图
安装 mod_wsgi
yum install httpd-devel # 安装apache的apxs扩展
yum install mod_wsgi # 安装mod_wsgi
yum install python36u-mod_wsgi # 如果是IUS仓库版本的python,请安装这个
查看安装的模块
ls /usr/lib64/httpd/modules/mod_wsgi.so
ls /etc/httpd/modules/mod_wsgi.so
ls /etc/httpd/conf.modules.d/*wsgi-python* # 查看Apache是否加载了mod_wsgi.so
配置虚拟主机
WSGIPythonPath (python文件搜索路径, 不建议使用)
用于指定python的搜索目录,其值是一系列的目录, 目录之间使用冒号(unix-like)或者分号(windows)分隔.如果目录包含空格则整个值需要用双引号括起来
该伪指令相当于执行了python的site.addsitedir()函数,该函数的功能是在初始化python时首先执行sys.path.append(),然后再处理目录中的*.pth文件
当apache找不到你的django工程时(此时会报500错误)可以尝试用该伪指令手动指定django工程的路径(django初学者可以直接指定为manage.py文件所在的目录,这样mod_wsgi就可以找到你创建的django apps了)
不建议配置该伪指令,你可以在你的django工程中的wsgi.py文件中加上
sys.path.append('/your/django/project/path')
, 注意这里的path必须使用绝对路径
**注意:**这是一个全局配置,多个项目时可能会有文件名冲突导致项目间混乱。
WSGIPythonHome
- 用于指定python解释器路径, 假如你的环境中有多个python解释器,你可以通过设置该伪指令的值来指定具体的python解释器,
- 其值为sys.prefix或者sys.prefix:sys.exec_prefix,即当sys.prefix的值与sys.exec_prefix一致时可以省略:sys.exec_prefix(这两个值以冒号分隔).
- 如果该值没有被正确设置则可能会报500错误.
编写httpd虚拟主机配置文件
>>> vim /etc/httpd/conf.d/virtualHost.conf
WSGIPythonPath /var/www/dongfeng
<VirtualHost *:80>
ServerName fs.dongfe.com
DocumentRoot /var/www/dongfeng
WSGIScriptAlias / /var/www/dongfeng/wsgi.py
Alias /static/ /var/www/dongfeng/static/
ErrorLog /var/log/httpd/dongfeng.com/error_log
CustomLog /var/log/httpd/dongfeng.com/access_log combined
</VirtualHost>
编写测试文件
>>> vim /var/www/dongfeng/wsgi.py
def application(environ, start_response):
status = "200 OK"
headers = [("Content-Type", "text/html")]
start_response(status.headers)
return [b"<h1>Hello World!</h1>"]
查看apache日志
错误日志
tail /var/log/httpd/error_log
访问日志
tail /var/log/httpd/access_log
多个Django项目部署
将项目加入python搜索路径:修改wsgi.py
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file)))
sys.path.append(BASE_DIR)
注意: 在多个django项目配置中,如果使用apache的WSGIPythonPath配置添加多个python搜索目录,项目间访问会混乱。
修改wsgi.py文件内的环境配置
#os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")
os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings" # 更改
注意: 在多个Django站点在单个mod_wsgi进程中运行,则所有这些站点将使用首先运行的设置,需要修改wsgi.py文件内的环境配置,否则会出现404错误
虚拟主机配置示例
>>> vim /etc/httpd/conf.d/virtualHost.conf
#WSGIPythonPath /var/www/dongfeng/:/var/www/fs/
<VirtualHost *:80>
ServerName www.dongfe.com
DocumentRoot /var/www/dongfeng
WSGIScriptAlias / /var/www/dongfeng/dongfeng/wsgi.py
Alias /static/ /var/www/dongfeng/static/
Alias /wordpress/ /var/www/dongfeng/wordpress/
</VirtualHost>
# 301跳转
<VirtualHost *:80>
ServerName dongfe.com
# 301跳转
<If "(%{HTTP_HOST} == 'dongfe.com') || (%{HTTP_HOST} == 'd.com')">
Redirect permanent / http://www.dongfe.com/
</If>
<ElseIf "!(%{HTTP_HOST} == 'www.dongfe.com') && !(%{HTTP_HOST} == 'localhost')">
Require all denied
</ElseIf>
</VirtualHost>
<VirtualHost *:80>
ServerName fs.dongfe.com
DocumentRoot /var/www/fs
WSGIScriptAlias / /var/www/fs/jiahua/wsgi.py
Alias /static/ /var/www/fs/static/
</VirtualHost>
热更新
安装inotify-tool监控文件变化
yum install inotify-tools
inotify-tools安装后会得到inotifywait
和inotifywatch
这两条命令:
- inotifywait命令可以用来收集有关文件访问信息,Linux发行版一般没有包括这个命令,需要安装inotify-tools,这个命令还需要将inotify支持编译入Linux内核,好在大多数Linux发行版都在内核中启用了inotify。
- inotifywatch命令用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。
inotifywait命令使用
-m
是要持续监视变化。-r
使用递归形式监视目录。-t
设置监视超时秒数-q
减少冗余信息,只打印出需要的信息。-e
指定要监视的事件列表。--timefmt
是指定时间的输出格式。--format
指定文件变化的详细信息。
可监听的事件
事件 | 描述 |
---|---|
access | 访问,读取文件。 |
modify | 修改,文件内容被修改。 |
attrib | 属性,文件元数据被修改。 |
move | 移动,对文件进行移动操作。 |
create | 创建,生成新文件 |
open | 打开,对文件进行打开操作。 |
close | 关闭,对文件进行关闭操作。 |
delete | 删除,文件被删除。 |
监控脚本
vim ~/autoHttpRestart.sh
#!/bin/bash
while [ 1 ]
do
# 监控文件是否开始变化,如果变化就继续
/usr/bin/inotifywait -r -e modify,create,move,delete /var/www >/dev/null 2>&1
while [ 1 ]
do
sleep 1 # 休眠一秒,可要可不要
modify_result=`/usr/bin/inotifywait -r -e modify,create,move,delete -t 10 /var/www 2>/dev/null`
if [ "$modify_result" == "" ] # 如果监控超时,即停止了变化
then
# 超时
echo "$(date +"%Y-%m-%d %T") 监控到web文件调整完毕,正在重启web服务器"
# 下面这个是重启web服务器的命令,可以自行修改
#systemctl restart httpd
uwsgi --reload /var/run/uwsgi.pid
echo "$(date +"%Y-%m-%d %T") 重启web服务器完毕"
break
else
# 文件发生了变化
:
fi
done
done
后台启动脚本:
# 开启文件执行权限
chmod a+x autoHttpRestart.sh
# 启动脚本
nohup ./autoHttpRestart.sh &
# 最后正常退出控制台
exit
# 停止脚本
kill -9 $(ps -ef | grep autoHttpRestart.sh | grep -v grep | awk '{print $2}')
nohup: 不挂起( no hang up),可以在你退出帐户之后继续运行相应的进程。
**&:**当前控制台的后台运行。
注意:使用了nohup之后,很多人就这样不管了,其实这样有可能在当前账户非正常退出或者结束的时候,命令还是自己结束了。所以在使用nohup命令后台运行命令之后,需要使用exit正常退出当前账户,这样才能保证命令一直在后台运行。
报错
No space left on device
No space left on device: AH00023: Couldn't create the proxy mutex
- 查看:
ipcs -s | grep apache
- 删除:
for semid in `ipcs -s | grep apache | cut -f2 -d" "`;
do ipcrm -s $semid; done