LAMP环境下搭建discuz!论坛
一、下载discuz!
1、创建目录
mkdir /data/www
2、进入目录
cd /data/www
3、下载discuz
wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GBK.zip
4、解压discuz
unzip Discuz_X3.2_SC_GBK.zip
5、把upload目录中的文件移动到当前目录下,也就/data/www/目下
mv upload/* .
6、删除掉其他的文件
[root@mysql www]# rm -rfDiscuz_X3.2_SC_GBK.zip readme/ utility/
upload空目录也要删除掉:[root@mysqlwww]# rm -rf upload/
二、配置第一个虚拟主机
1、用vim打开/usr/local/apache2/conf/httpd.conf文件
删除httpd.conf中的这行前面的#号
#Include conf/extra/httpd-vhosts.conf
2、在vim /usr/local/apache2/conf/extra/httpd-vhosts.conf配置文件中
加入如下配置:
<VirtualHost *:80> DocumentRoot "/data/www" #网站的根目录 ServerName www.guhantai.cn #主机域名 ServerAlias www.guhantai.com.cn #第二个域名 #ErrorLog "logs/dummy-host.example.com-error_log" #CustomLog "logs/dummy-host.example.com-access_log" common </VirtualHost>>
有两个虚拟主机,删除掉一个,
保存之后退出
3、检查配置文件
[root@mysql www]#/usr/local/apache2/bin/apachectl -t Syntax OK #出现这个提示就说明已经好了
4、更改Windows hosts文件做解析,将www.guhantai.cn解析到Linux主机的IP
c:\Windows\System32\drivers\etc\hosts
192.168.21.97 www.guhantai.cnwww.guanhaitai.com.cn
5、在Windows浏览器测试的时候提示无法找到网页,错误代码404
6、修改vim/usr/local/apache2/conf/httpd.conf文件,如下图:
7、然后使用如下命令来检测配置文件是否OK:
[root@mysql www]# /usr/local/apache2/bin/apachectl -t Syntax OK #出现这个表示配置文件时正确的
8、重启apache服务
[root@mysqlwww]# /usr/local/apache2/bin/apachectl restart
9、再次在浏览器中输入http://www.guhantai.cn/install/的时候访问正常,出现了Discuz的安装向导界面,如下图:
10、点击“我同意”
11、进入到下一步界面,红色的“x”表示是没有写权限,如图所示:
12、使用[root@mysql www]#ps aux |grep http查看Apache使用的账号是daemon
13、给daemon账号授权,让daemon账号对支持Apache的目录进行可写的操作
[root@mysqlwww]# chown -R daemon data/ config/ uc_server/data/ uc_client/data/
14、再次刷新时,红色的“x”消失了,变成写的了
15、点击下一步
进入到设置运行环境界面,选择全新安装,下一步,进入到安
装数据库界面
然后下一步,开始安装
16、安装完成,进入论坛
17、进入论坛的管理中心之后,会出现一个提示,为了安全起见要把install/index.php干掉
删除install/index.php:
[root@mysql www]# rm -rf install/index.php
三、配置mysql,给Discuz!增加一个账户
1、首先检查Mysql有没有启动
[root@mysqlwww]# ps aux |grep mysql
2、登录MySQL
登录MySQL的时候提示没有mysql这个命令,
[root@mysql www]# mysql -uroot -bash: mysql: command not found
后来查看passwd文件,发现是禁止登陆的
现在先更改PATH,允许mysql登录:
[root@mysqlwww]# PATH=$PATH:/usr/local/mysql/bin
也可以这样子做:
[root@mysql www]# /usr/local/mysql/bin/mysql �Curoot
现在登录mysql就可以登录进去
[root@mysqlwww]# mysql �Curoot
3、给mysql设定密码
[root@mysqlwww]# mysqladmin -uroot password '123456'
123456就是msyql设定的登录密码
用账号和密码登录msyq
[root@mysqlwww]# mysql -uroot -p123456
4、创建一个名称为cheng的数据库
mysql>create database cheng;
5、创建一个用户,用来授权
mysql>grant all on cheng.* to 'cheng'@'localhost' identified by '123456';
grant:授权
all:所有权限
identified:密码
cheng'@'localhost:新创建的用户,并且制定登录本机
cheng:第4步创建的数据库名称
这个命令的意思,就是创建一个名称为cheng的用户,只限于在本机登录,而且对cheng这个数据库有所有权限
四、为某个虚拟主机配置用户认证
1、 在虚拟主机配置文件中加入以下内容,创建apache的验证用户
虚拟主机配置文件位置:vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
加入以下内容:
代码如下:
<Directory *>#这里的*表示的是针对这台虚拟主机来的,也可以写成绝对路径/data/www
AllowOverride AuthConfig
AuthName "自定义的"
AuthType Basic
AuthUserFile /data/.htpasswd # 这里的/data/.htpasswd你可以随便写一个路径或名字,没有限制
require valid-user
</Directory>
2、 为用户创建密码文件
[root@mysql www]# /usr/local/apache2/bin/htpasswd -c/data/.htpasswd cheng
为cheng用户创建密码文件,第一次创建.htpasswd需要加上-c,如果.htpasswd已经存在,-c会覆盖
3、 查看/data/.htpasswd文件
[root@mysqlwww]# cat /data/.htpasswd cheng:v5o0GkUDbIh8c
左边是用户名,冒号右边是密码。密码是加密的
4、 检查配置文件看看有错误没有
[root@mysqlwww]# /usr/local/apache2/bin/apachectl -t Syntaxerror on line 35 of /usr/local/apache2/conf/extra/httpd-vhosts.conf: AuthUserFiletakes 1-2 arguments, text file containing user IDs and passwords
提示配置文件的第35行有错误
排错:
使用vim查看/usr/local/apache2/conf/extra/httpd-vhosts.conf文件,看看是哪里错误了
删除多出来的那一行文字,再检查配置文提示已经OK了
[root@mysql www]#/usr/local/apache2/bin/apachectl -t Syntax OK
在重启一下apache服务
[root@mysql www]#/usr/local/apache2/bin/apachectl restart
5、 在此刷新网页的时候,提示要输入账号和密码才可以访问或者查看论坛
五、配置域名跳转
1、 单域跳转,将一下代码拷贝到/usr/local/apache2/conf/extra/httpd-vhosts.conf文件中的第35行下面。具体如下图所示:
代码如下:
<IfModulemod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domain1.com$
RewriteRule ^/(.*)$ http://www.domain2.com/$1 [R=301,L]
</IfModule>
检查配置文件
[root@mysql www]#/usr/local/apache2/bin/apachectl -t
Syntax OK
重启apache服务
[root@mysql www]#/usr/local/apache2/bin/apachectl restart
2、如果是多个域名,可以这样设置:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domain.com [OR]
RewriteCond %{HTTP_HOST} ^www.domain1.com$
RewriteRule ^/(.*)$ http://www.domain2.com/$1 [R=301,L]
</IfModule>
方法和但域名设置是一样的,只是代码不一样而已
3、测试
在linux上测试
[root@mysql www]#curl -u cheng:123456-x127.0.0.1:80 www.guhantai.cn/forum.php -I HTTP/1.1 301 Moved Permanently Date: Sat, 13 Jun 2015 09:40:47 GMT Server: Apache/2.2.16 (Unix) DAV/2PHP/5.3.28 Location:http://www.guhantai.com.cn/forum.php Content-Type: text/html; charset=iso-8859-1
这个测试结果就是正确的
六、配置apache的访问日志
1、 查看日志格式,在主配置文件里面
[root@mysql ~]# vim /usr/local/apache2/conf/httpd.conf # 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> # You need to enable mod_logio.c to use %I and %O LogFormat "%h %l %u %t \"%r\" %>s %b\"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio </IfModule>
User-Agent:用来识别浏览器的
2、 进入虚拟主机配置文件,配置日志
[root@mysql ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
修改成以下类容具体如图:
代码如下:
#配置日志 ErrorLog"/usr/local/apache2/logs/dummy-host.example.com-error_log" SetEnvIf Request_URI".*\.gif$" image-request SetEnvIf Request_URI".*\.jpg$" image-request SetEnvIf Request_URI".*\.png$" image-request SetEnvIf Request_URI".*\.bmp$" image-request SetEnvIf Request_URI".*\.swf$" image-request SetEnvIf Request_URI".*\.js$" image-request SetEnvIf Request_URI".*\.css$" image-request CustomLog"|/usr/local/apache2/bin/rotatelogs -l/usr/local/apache2/logs/1.com-access_%Y%m%d.log 86400" combinedenv=!image-request </VirtualHost>
3、修改完成之后,保存退出,并且检查配置文是否配置正确,如果正确那么久重启服务
[root@mysql ~]# /usr/local/apache2/bin/apachectl -t
Syntax OK
4、 重启apache服务
[root@mysql ~]# /usr/local/apache2/bin/apachectl restart
5、 查看/usr/local/apache2/logs/目下有没有日志
[root@mysql www]# ls/usr/local/apache2/logs/ 1.com-access_20150613.log access_log error_log 1.com-access.log dummy-host.example.com-error_log httpd.pid
dummy-host.example.com-error_log:这个日志是针推这个虚拟主机的
error_log:这个是针对整个apache的
|/usr/local/apache/bin/rotatelogs -l :日志切割工具
七、配置静态文件缓存
将一下配置文件拷贝到/usr/local/apache2/conf/extra/httpd-vhosts.conf配置文件中去。就拷贝在配置日志文件的下面就可以了。具体如图:
代码如下:
<IfModule mod_expires.c> ExpiresActive on ExpiresByType image/gif "access plus 1 days" ExpiresByType image/jpeg "access plus 24 hours" ExpiresByType image/png "access plus 24 hours" ExpiresByType text/css "now plus 2hour" ExpiresByType application/x-javascript "now plus 2 hours" ExpiresByType application/javascript"now plus 2 hours" ExpiresByType application/x-shockwave-flash "now plus 2 hours" ExpiresDefault "now plus 0 min" </IfModule>
保存退出
检查配置文件是否有错
[root@mysql www]#/usr/local/apache2/bin/apachectl -t
Syntax OK
重启apache服务
[root@mysql www]#/usr/local/apache2/bin/apachectl restart
测试一
在根目录创建一个1.txt文件
[root@mysql www]# touch 1.txt
在1.txt文件中写内容
[root@mysql www]# echo "1111"> 1.txt
在Linux系统中测试
[root@mysql www]# curl -u cheng:123456-x127.0.0.1:80 www.guhantai.com.cn/1.txt -I HTTP/1.1 200 OK Date: Sat, 13 Jun 2015 21:29:58 GMT Server: Apache/2.2.16 (Unix) DAV/2PHP/5.3.28 Last-Modified: Sat, 13 Jun 2015 21:26:28GMT ETag: "a1547-5-5186ce0b0d705" Accept-Ranges: bytes Content-Length: 5 Cache-Control: max-age=0 #这里是数字0表示的还没有缓冲文件 Expires: Sat, 13 Jun 2015 21:29:58 GMT Content-Type: text/plain
测试二
创建一个1.jpg格式的文件
[root@mysql www]# touch 1.jpg
在Linux系统中测试
[root@mysql www]#curl -u cheng:123456-x127.0.0.1:80 www.guhantai.com.cn/1.jpg -I HTTP/1.1 200 OK Date: Sat, 13 Jun 2015 21:38:39 GMT Server: Apache/2.2.16 (Unix) DAV/2PHP/5.3.28 Last-Modified: Sat, 13 Jun 2015 21:37:54GMT ETag: "a1548-0-5186d098fe20d" Accept-Ranges: bytes Cache-Control: max-age=86400 #这里就有数字了 Expires: Sun, 14 Jun 2015 21:38:39 GMT #过期时间 Content-Type: image/jpeg
八、配置防盗链
1、在配置文件/usr/local/apache2/conf/extra/httpd-vhosts.conf加入以下代码,代码存放的位置如图:
代码:
SetEnvIfNoCase Referer"^http://www.guhantai.com.cn" local_ref SetEnvIfNoCase Referer"www.guhantai.cn" local_ref SetEnvIfNoCase Referer "^$"local_ref <filesmatch"\.(txt|doc|mp3|zip|rar|jpg|gif)"> Order Allow,Deny Allow from env=local_ref </filesmatch>
然后保存退出
2、检查刚才的配置文件是否有错误
[root@mysql www]# /usr/local/apache2/bin/apachectl -t
Syntax OK
3、重启apache服务
[root@mysql www]# /usr/local/apache2/bin/apachectl restart
4、 测试是否成功
[root@mysql www]# curl -u cheng:123456-e"http://www.baidu.com/2.txt" -x127.0.0.1:80www.guhantai.com.cn/1.jpg -I HTTP/1.1403 Forbidden Date:Sat, 13 Jun 2015 22:37:18 GMT Server:Apache/2.2.16 (Unix) DAV/2 PHP/5.3.28 Content-Type: text/html; charset=iso-8859-1
这个就是模拟的把guhantai.com.cn网站下的1.txt文件挂载到baidu网站下去,然后通过百度网站的链接来访问这个文件,提示不可以访问,说明防盗链接配置成功了,当然,这里只是模拟,可以使用百度或者其他的都可以
九、访问控制
1、把一下代码复制到/usr/local/apache2/conf/extra/httpd-vhosts.conf文件中,需要注意的是要把代码放在防盗链配置文件的后面才可以,不可以写到前面。(实验的最后会有全文的配置文件,一定要按照配置文档的实验顺序才可以,不然可能会出错)
#访问控制
<Directory /data/www/> <filesmatch ".*"> #匹配所有 Order deny,allow Deny from all Allow from 127.0.0.1 </filesmatch> </Directory>
退出保存
检查配置文件
[root@mysql ~]#/usr/local/apache2/bin/apachectl -t
Syntax OK
重启apache服务
[root@mysql ~]#/usr/local/apache2/bin/apachectl restart
浏览器访问测试成功
在Linux上测试是OK的
[root@mysql www]# curl -u cheng:123456-x127.0.0.1:80 www.guhantai.com.cn/1.jpg -I HTTP/1.1 200 OK Date: Sun, 14 Jun 2015 04:33:42 GMT Server: Apache/2.2.16 (Unix) DAV/2PHP/5.3.28 Last-Modified: Sat, 13 Jun 2015 21:37:54GMT ETag: "a1548-0-5186d098fe20d" Accept-Ranges: bytes Content-Type: image/jpeg
这应用场景一般在针对某个特殊的目录来的可以这样子写
<Directory /data/www/adc> 这个写法就是针对abc这个目录来的
2、针对请求的uri去限制,只允许内网和指定的ip才可以访问包含admin关键词的地址
<filesmatch "(.*)admin(.*)">
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from 192.168.21.100
</filesmatch>
这里的两个IP地址的意思就是说,除了这两IP地址之外,其他的IP地址及访问带有admin关键字时会直接禁止
修改完配置文件之后一定要检查配置文件,然后在重启apache服务
3、某个目录下禁止解析php,做这个实验的是时候最好的是吧之前的访问控制和精致访问admin后台的相关的配置禁用掉,以免出错都是在/usr/local/apache2/conf/extra/httpd-vhosts.conf文件中来修改配置的
<Directory /data/www/uc_server>
php_admin_flag engine off
<filesmatch "(.*)php">
Order deny,allow
Deny from all
</filesmatch>
</Directory>
修改完配置文件之后一定要检查配置文件,然后在重启apache服务
测试,在uc_server目下写一个php脚本
>?php
echo 12345678;
?>
不禁止会暴露php源代码
[root@mysql www]# curl -u cheng:123456-x192.168.21.97:80 'http://www.guhantai.com.cn/uc_server/2.php' >?php echo 12345678; ?>
禁止后
[root@mysql www]# curl -u cheng:123456-x192.168.21.97:80 'http://www.guhantai.com.cn/uc_server/2.php' <!DOCTYPE HTML PUBLIC "-//IETF//DTDHTML 2.0//EN"> <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission toaccess /uc_server/2.php on this server.</p> </body></html>
这样就无法看到php的源代码
目录使用diectory
<Directory /data/www/ uc_server > :只要是uc_server目录下php全部都禁用掉,这个目录根据实际的需来写
十、配置伪静态规则
Mod_rewite是apache的一个非常强大的功能,它可以实现伪静态
1、 在discuz!管理后台页面―全局―左侧SEO设置―URL伪静态,右边全部打钩,具体如下图所示:
2、 在/usr/local/apache2/conf/extra/httpd-vhosts.conf配置文件中加入以下代码:
#RewriteRule^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /forum.php?mod=viewthread&tid=$1&extra=page%3D$2 RewriteRule^/topic-(.+)\.html$ /portal.php?mod=topic&topic=$1&%1 RewriteRule^/article-([0-9]+)-([0-9]+)\.html$/portal.php?mod=view&aid=$1&page=$2&%1 RewriteRule^/forum-(\w+)-([0-9]+)\.html$ /forum.php?mod=forumdisplay&fid=$1&page=$2&%1 RewriteRule^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$/forum.php?mod=viewthread&tid=$1&extra=page\%3D$3&page=$2&%1 RewriteRule^/group-([0-9]+)-([0-9]+)\.html$/forum.php?mod=group&fid=$1&page=$2&%1 RewriteRule^/space-(username|uid)-(.+)\.html$ /home.php?mod=space&$1=$2&%1 RewriteRule^/blog-([0-9]+)-([0-9]+)\.html$/home.php?mod=space&uid=$1&do=blog&id=$2&%1 RewriteRule^/archiver/(fid|tid)-([0-9]+)\.html$/archiver/index.php?action=$1&value=$2&%1 RewriteRule^/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ /plugin.php?id=$1:$2&%1
如图所示位置:
十二、apache限制指定user_agent,把一下代码拷贝到/usr/local/apache2/conf/extra/httpd-vhosts.conf文件中,紧挨着域名跳转开始
代码如下:
<IFModulemod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^.*MSIE\ 8.0*[NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*curl* [NC]
RewriteRule .* - [F]
</IFModule>
修改完配置文件之后,一定要检查配置文件,然后在重启apache服务
测试:
十三、附件,附时间中的实例配置文件
<VirtualHost *:80> DocumentRoot "/tmp/tmp" ServerName tmp.com <Directory /tmp/tmp/> Order allow,deny Deny from all </Directory> </VirtualHost> <VirtualHost *:80> DocumentRoot "/data/www" ServerName www.1.com ServerAlias www.a.com www.b.com ServerAlias www.c.com # 用户认证 # <Directory /data/www> # AllowOverride AuthConfig # AuthName "alksdjflkasjdf" # AuthType Basic # AuthUserFile /data/.htpasswd # require valid-user # </Directory> # 域名跳转 <IfModule mod_rewrite.c> RewriteEngine on # RewriteCond %{HTTP_HOST} ^www.a.com$ [OR] RewriteCond %{HTTP_HOST} !^www.1.com$ RewriteRule ^/(.*)$ http://www.1.com/$1 [R=301,L] RewriteRule ^/(.*)\.png$ /static/image/common/fav.gif [R=302]#这个没有多大意义 #伪静态规则 #RewriteRule ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /forum.php?mod=viewthread&tid=$1&extra=page%3D$2 RewriteRule ^/topic-(.+)\.html$ /portal.php?mod=topic&topic=$1&%1 RewriteRule ^/article-([0-9]+)-([0-9]+)\.html$ /portal.php?mod=view&aid=$1&page=$2&%1 RewriteRule ^/forum-(\w+)-([0-9]+)\.html$ /forum.php?mod=forumdisplay&fid=$1&page=$2&%1 RewriteRule ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /forum.php?mod=viewthread&tid=$1&extra=page\%3D$3&page=$2&%1 RewriteRule ^/group-([0-9]+)-([0-9]+)\.html$ /forum.php?mod=group&fid=$1&page=$2&%1 RewriteRule ^/space-(username|uid)-(.+)\.html$ /home.php?mod=space&$1=$2&%1 RewriteRule ^/blog-([0-9]+)-([0-9]+)\.html$ /home.php?mod=space&uid=$1&do=blog&id=$2&%1 RewriteRule ^/archiver/(fid|tid)-([0-9]+)\.html$ /archiver/index.php?action=$1&value=$2&%1 RewriteRule ^/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ /plugin.php?id=$1:$2&%1 RewriteCond %{HTTP_USER_AGENT} ^.*Firefox/4.0* [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^.*curl* [NC] RewriteRule .* - [F] </IfModule> # 配置日志 ErrorLog "/usr/local/apache2/logs/dummy-host.example.com-error_log" SetEnvIf Request_URI ".*\.gif$" image-request SetEnvIf Request_URI ".*\.jpg$" image-request SetEnvIf Request_URI ".*\.png$" image-request SetEnvIf Request_URI ".*\.bmp$" image-request SetEnvIf Request_URI ".*\.swf$" image-request SetEnvIf Request_URI ".*\.js$" image-request SetEnvIf Request_URI ".*\.css$" image-request CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/1.com-access__%Y%m%d.log 86400" combined env=!image-request # 配置静态文件缓存 #<IfModule mod_expires.c> # ExpiresActive on # ExpiresByType image/gif "access plus 1 days" # ExpiresByType image/jpeg "access plus 24 hours" # ExpiresByType image/png "access plus 24 hours" # ExpiresByType text/css "now plus 2 hour" # ExpiresByType application/x-javascript "now plus 2 hours" # ExpiresByType application/javascript "now plus 2 hours" # ExpiresByType application/x-shockwave-flash "now plus 2 hours" # ExpiresDefault "now plus 0 min" #</IfModule> <Ifmodule mod_headers.c> <filesmatch "\.(html|htm|txt)$"> header set cache-control "max-age=3600" </filesmatch> <filesmatch "\.(css|js|swf)$"> header set cache-control "max-age=604800" </filesmatch> <filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$"> header set cache-control "max-age=29030400" </filesmatch> </ifmodule> # 配置防盗链 <Directory /data/www/> SetEnvIfNoCase Referer "^http://www.1.com" local_ref SetEnvIfNoCase Referer "www.a.com" local_ref SetEnvIfNoCase Referer "www.b.com" local_ref SetEnvIfNoCase Referer "^$" local_ref <filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)"> Order Allow,Deny Allow from env=local_ref </filesmatch> </Directory> # 访问控制 #<Directory /data/www/admin> #<filesmatch ".*"> # Order deny,allow # Deny from all # Allow from 127.0.0.1 #</filesmatch> #</Directory> #禁止访问admin.php后台 #<Directory /data/www> #<Filesmatch "^admin.php(.*)$"> #匹配文件的时候在做限制 # Order deny,allow # Deny from all # Allow from 127.0.0.1 #</Filesmatch> #</Directory> #禁止某个目录下禁止解析php <Directory /data/www/uc_server> php_admin_flag engine off <filesmatch "(.*)php"> Order deny,allow Deny from all </filesmatch> </Directory> </VirtualHost>
笔记如果有错误的地方,还请大神们指正出来,当然我也会继续修改