WebGL Tutorial
and more

Apache服务器管理必读

撰写时间:2023-05-11

修订时间:2023-05-17

Unix, Linux系统中,较常见的服务器端环境是Apache, MySQL及PHP。网络上面有各种各样的集成安装包可供下载安装,如LAMP, MAMP等等。但这些安装包不适用于某些系统或某些版本的系统,如果您的运气不佳,所使用的系统无法直接安装这些安装包,没办法,您只能手工安装并自己配置了。

本文论述了在Ubuntu系统中安装、运行、配置、管理Apache服务器等应知应会的相关知识。

安装

在终端中运行:

sudo apt install apache2

安装后,可通过:

which apache2

来查看其安装路径。一般情况下,它会安装到/usr/sbin路径中。该目录下共有3个文件:

  • apache2: 共享库
  • apache2ctl: Apache2的控制Shell脚本
  • apachectl: 指向apache2ctl的快捷方式

除此之外,/etc/init.d路径下还有一个名为apache2的shell脚本,该脚本用于启动Apache服务器。

运行

在启动或关闭Apache服务器时,由于需要调用多个环境变量,因此默认配置下不能直接调用/usr/sbin/apache2。而应通过调用/etc/init.d/apache2/usr/sbin/apache2ctl来进行。

通过service方式运行

在终端中运行:

sudo service apache2 start

将启动Apache2服务。在浏览器中访问:

http://localhost

即可看到Apache2服务器运行的情况,说明了安装及运行情况正常。

默认情况下,Apache2的文档根目录(DocumentRoot)位于/var/www/html路径中。该路径在安装完毕后只有一个名为index.html的文件,即是我们访问http://localhost时读取的文件内容。

可通过

sudo service apache2 --status-all

来查看Apache2服务所支持的全部命令:

sudo service apache2 start sudo service apache2 stop sudo service apache2 graceful-stop sudo service apache2 restart sudo service apache2 reload sudo service apache2 force-reload

这些命令,可启动、停止、重启、重新加载Apache2服务。在安装好服务器后,Apache2的服务在系统登录时会自动运行。

通过apachectl方式运行

在终端中运行:

sudo apachectl

可看到该命令的帮助:

sudo apachectl start sudo apachectl stop sudo apachectl restart sudo apachectl graceful sudo apachectl graceful-stop sudo apachectl configtest sudo apachectl status sudo apachectl fullstatus sudo apachectl help

当带有-k选项时,可以执行以下命令:

sudo apachectl -k start sudo apachectl -k restart sudo apachectl -k graceful sudo apachectl -k graceful-stop sudo apachectl -k stop

当带有-S选项时,可查看相关配置情况:

apachectl -S

显示:

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message VirtualHost configuration: *:80 127.0.1.1 (/etc/apache2/sites-enabled/000-default.conf:1) ServerRoot: "/etc/apache2" Main DocumentRoot: "/var/www/html" Main ErrorLog: "/var/log/apache2/error.log" Mutex default: dir="/var/run/apache2/" mechanism=default Mutex watchdog-callback: using_defaults PidFile: "/var/run/apache2/apache2.pid" Define: DUMP_VHOSTS Define: DUMP_RUN_CFG User: name="www-data" id=33 not_used Group: name="www-data" id=33 not_used

从上面可以看出几个重要的信息。一是日志文件是/var/log/apache2/error.log,当遇到在浏览器中无法访问网站等问题时,可在这里查看错误信息以排除问题。二是显示了ServerRootDocumentRoot的位置。三是显示了Apache2需要访问特定路径的UserGroup.

Apache2服务器的基本配置一览

Apache2服务器的众多配置文件存放于/etc/apache2路径下。

  • /etc/apache2
    • conf-available
    • conf-enabled
    • mods-available
    • mods-enabled
    • sites-available
      • 000-default.conf
      • default-ssl.conf
    • sites-enabled
      • 000-default.conf
    • apache2.conf
    • apache2.conf.in
    • envvars
    • magic
    • ports.conf

apache2.conf是最顶层的配置文件。它包含了其他配置文件。这里摘录一些主要内容如下:

<Directory> Options FollowSymLinks AllowOverride None Require all denied </Directory> <Directory /usr/share> AllowOverride None Require all granted </Directory> <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>

一是定义了UserGroup,在/etc/apache2/envvars文件中定义,其值均是www-data

二是配置了Apache2 httpd服务器的安全访问机制。即服务器仅允许访问/usr/share/var/www两条路径,若访问其它的路径一概予以拒绝。/usr/share是Debian系统中专用于Web应用的,/var/www/专用于存放服务器对外界所提供的Web服务的网页内容。

/etc/apache2/sites-enabled路径有一个名为000-default.conf文件,声明了一个虚拟主机的基本情况:

<VirtualHost *:80> ... ServerAdmin webmaster@localhost DocumentRoot /var/www/html ... </VirtualHost>

它声明一个虚拟主机,用于监听所有端口号为80的HTTP Request. 这里未设置具体的主机名,是有意而为之。Apache2有一条规则:如果遇到未符合条件的请求,则会取第一个虚拟主机的配置来应对。由于这里未设置任意主机名,因此能监听要访问所有端口号为“80”的任意主机的请求。但,要求新的虚拟主机应配置具体的主机名。

可见,它取apache2.conf中所定义的/var/wwww/作为默认路径,并在它之下新建一个名为html的路径作为DocumentRoot

ports.conf文件用于配置默认的服务器端口:

Listen 80 <IfModule ssl_module> Listen 443 </IfModule> <IfModule mod_gnutls.c> Listen 443 </IfModule>

服务器默认端口为80。注意,如果在此改了端口,则需相应地也修改000-default.conf文件中的端口配置。

/etc/apache2/mods-enabled/dir.conf定义了首页文件的顺序:

<IfModule mod_dir.c> DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm </IfModule>

下面,我们将利用这些基础知识来解决一些实际的问题。

解决HostName的问题

如果遇到:

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message

的提示,这是因为如上节所述,Apache2默认情况下没有设置ServerName的原因。先在Apache2的配置文件位置添加一个名为fqdn.conf的文件并打开编辑:

sudo nano /etc/apache2/conf-available/fqdn.conf

nanoUnix系统下面可在终端中修改文件内容的工具。我们在这里使用它而不是将特定文件拖至例如NetBeans中编辑的原因是,一些文件属于用户root, 具有最高的保护权限。当在IDE中编辑时,因权限不够,文件会显示为灰色,表示不可编辑。而使用sudo命令,可授予这种权限。并且,nano将其命令及快捷键都显示在下端,非常方便。最常用的两个命令是Ctrl+O存盘,Ctrl+X退出。下面会多次用到这个命令。

加入以下内容:

ServerName localhost

存盘退出。现在激活它:

sudo a2enconf fqdn

这是Apache2的命令,因此即使没有指定文件扩展名,它也知道如何去找这个配置文件。激活后,运行:

sudo service apache2 reload

上面有问题的提示就会消失。

更改DocumentRoot

现在,我们准备将默认虚拟主机的DocumentRoot更改为/home/sarkuya/public_html。如果该路径还不存在,先创建它,用户名换成您自己的。

首先,在apache2.conf文件中添加一项以允许访问新的路径:

<Directory /home/sarkuya/public_html/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>

第二,将默认的虚拟主机的DocumentRoot指向该路径。修改000-default.conf的内容,将

ServerAdmin webmaster@localhost DocumentRoot /var/www/html

改为:

ServerAdmin webmaster@localhost DocumentRoot /home/sarkuya/public_html

现在,需要授权Apache2相应的权限以访问该目录。Apache2需要什么具体的权限?

我们先看Apache2默认所配置的DocumentRoot的所有路径的权限:

namei -m /var/www/html/index.html

注意,由于我们需要显示整条路径链,因此命令行中最后的参数是/var/www/html/index.html。如果我们将当前路径转到入html下面,然后仅以index.html作为最后的参数,则仅列出index.html文件的权限。输入上面的命令后,显示:

f: /var/www/html/index.html drwxr-xr-x / drwxr-xr-x var drwxr-xr-x www drwxr-xr-x html -rw-r--r-- index.html

这一路下来,文件夹的权限是:用户有rwx权限,用户组及其它用户只有rx权限。而对于文件的权限是:用户有rw权限,用户组及其它用户只有r权限。可见,Apache2的要求并不高,对目录有读的权限就行(能读目录的权限为x),对文件也仅有读的权限就行。

我们要设置的/home/sarkuya/public_html目录下仅有一个文件index.html。查看这条路径的权限情况:

namei -m /home/sarkuya/public_html/index.html

显示:

f: /home/sarkuya/public_html/index.html drwxr-xr-x / drwxr-xr-x home drwx------ sarkuya drwxrwxr-x public_html -rw-r--r-- index.html

对比之后,会发现在/home/sarkuya路径卡住了。用户组及其他用户对其均没有rx权限,这就导致Apache2的用户及用户组无法读取该目录,以及该目录下的所有文件的内容。这是UNIX的默认设置:对于特定用户的专有路径,用户组及其他用户均无相应权限。现在,作为例子,我们准备将该路径开放给Apache2的默认用户及默认用户组使用。

Apache访问时所需的权限,文件夹权限drwxr-x-r-x对应于数字755,文件权限rw-r--r--对应于数字644。由于路径链中只有/home/sarkuya路径的权限不够,因此只需对其设置:

chmod 755 /home/sarkuya

再使用命令:

namei -m /home/sarkuya/public_html/index.html

检查路径链的权限情况以确认一路畅通。现在,可以在浏览中访问http://localhost了。

激活新的网站

Apache2可以同时配置多个网站(确切来讲,是虚拟主机, virtual host),并根据需要屏蔽或激活它们。当最初安装好Apache2后,只有一个网站,其配置文件是/etc/apache2/sites-available/000-default.conf。现在我们准备创建并激活第二个网站。这个网站使用新的域名,新的DocumentRoot.

复制模版:

sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/mysite.conf

修改mysite.conf

sudo nano /etc/apache2/sites-available/mysite.conf

加入主机名:

ServerName mysite

参照上一节指定其他的路径作为新的DocumentRoot

修改/etc/hosts文件:

sudo nano /etc/hosts

加入新域名:

127.0.0.1 localhost /* exists before */ 127.0.0.1 mysite

注意使用TAB键作为分隔符。

如果需要批量加入众多域名,也可以使用下面的方式:

127.0.0.1 localhost mysite virtualdomain1.com virtualdomain2.com virtualdomain3.com

当然,如果您真有这些多的需求,您都可以对外营业提供虚拟主机的服务了。:)

/etc/hosts文件用于在我们自己的电脑上解析域名,经上述操作后,当我们在本机上的浏览器中输入上述域名,均会导致访问127.0.0.1,这是本机域名。而由于这些域名没有经过域名运营商经过公网的DNS解析,互联网上的其他用户就不会在他们的浏览器上输入上述域名而访问到我们主机上的这些域名。

屏蔽旧虚拟主机:

sudo a2dissite 000-default

当运行上面的指令时,Apache2将删除/etc/apache2/sites-enable目录下面的000-default.conf文件。别担心,它只不过是一个快捷方式。当特定的配置文件在该目录下没有相应的快捷方式,此配置文件就不会起作用。

启用新虚拟主机:

sudo a2ensite mysite

当运行上面的指令时,Apache2将/etc/apache2/sites-available/mysite.conf文件作为快捷方式复制到/etc/apache2/sites-enable目录下面。

重启服务器:

sudo service apache2 restart

最后,访问http://mysite以验证。实际上,也可以访问http://localhost。这是因为根据/etc/hosts里面的配置,这两个域名同时都指向了同一个地址。

同时激活两个虚拟主机

上一节中,我们先屏蔽了000-default.conf,然后再激活mysite.conf,还是这就导致了无论访问http://localhost,还是http://mysite,都只有一个虚拟主机在服务。现在,我们准备同时激活两个域名,且它们都持有各自的DocumentRoot

回顾000-default.conf的内容:

<VirtualHost *:80> ... ServerAdmin webmaster@localhost DocumentRoot /var/www/html ... </VirtualHost>

这是默认的域名http://localhost,文档根目录在/var/www/html

回顾mysite.conf的内容:

<VirtualHost *:80> ... ServerAdmin webmaster@localhost ServerName mysite DocumentRoot /home/sarkuya/public_html ... </VirtualHost>

这是新域名http://mysite,文档根目录在/home/sarkuya/public_html。这已经满足我们的要求。现在所需做的,仅是重新激活000-default.conf即可:

sudo a2ensite 000-default;

为保险,也可再次激活mysite.conf

sudo a2ensite mysite;

重启Apache2服务:

sudo service apache2 restart

好了,访问http://localhost,以及http://mysite,它们显示的网页不同了。目标达成。

MAMP

当安装了MAMP后,如果系统之前已安装了Apache,则在命令行下调用apachectl等命令时,就会调用之前所安装的Apache2的命令,而不是MAMP所带的命令。因此,应从MAMP的安装路径查找相关的资源。

MAMP的安装路径为/Applications/MAMP,其Apache的配置路径为conf/apache,下面有httpd.conf, magicmime.types3个文件。

httpd.conf中定义了DocumentRoot,但若要在此文件中手工修改DocumentRoot,还应同时手工修改相应的DIRECTORY,因此最好从界面UI予以修改此值。

mime.types列出了所有的MIME types. 默认情况下,其对JavaScript的支持仅为:

application/javascript js

可以看出,默认情况下,MAMP不支持.mjs的JavaScript模块文件。

IANAMedia Types列出了最新的MIME types。对比之下,MAMP并不全面支持该MIME types

要添加特定的MIME type,修改httpd.confmime.types均可达到目标。但mime.types较长,较好的方法是在httpd.conf修改。

备份好httpd.conf文件,在其IfModule mime_module的底部加入如下内容:

<IfModule mime_module> ... AddType application/wasm .wasm AddType application/javascript .mjs </IfModule>

修改后,重启MAMP

运行demo

参考资源

  1. Apache HTTP Server Project
  2. VirtualHost Examples
  3. httpd - Apache Hypertext Transfer Protocal Server
  4. PHP Debian GNU/Linux installation notes
  5. Ubuntu ApacheMySQLPHP
  6. Apache2 Permission Denied
  7. wampserver.com