在Azure平台上使用Ubuntu和Apache2,配置PHP和虚拟主机。请注意,这是一种可能的中文翻译方式,不同的表达方法也是可以的
「从Azure上的Ubuntu / Apache2搭建Web服务器直至发布」
在您设定的Web服务器上进行以下配置
-
- PHP
-
- UserDir
- VirtualHost
环境
-
- サーバ Microsoft Azure 上の Ubuntu 22.04
- ローカルPC Ubuntu 22.04
本次使用Azure上的虚拟服务器作为服务器,但并未特别使用Azure的功能。
安装PHP
azureuser@test-azure-gen:~$ sudo apt install php
我要制作测试脚本。(Wǒ .)
$ sudo vim /var/www/html/phpinfo.php
这个东西只有这个。
<?php
phpinfo();
?>
在浏览器中确认后,可以看到如先前文章所述的文档根目录文件列表。

打开phpinfo.php文件,会显示相关信息。

似乎已经安装了php8.1。
使用UserDir功能
这是一个允许用户公开本地 public_html 文件夹的功能。
作为本地用户,我将添加一个示例。
$ sudo adduser example
Adding user `example' ...
Adding new group `example' (1001) ...
Adding new user `example' (1001) with group `example' ...
Creating home directory `/home/example' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for example
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
我成为用户。
azureuser@test-azure-gen:~$ su - example
Password:
example@test-azure-gen:~$ pwd
/home/example
创建一个public_html文件夹,并将html文件放置其中。
example@test-azure-gen:~$ mkdir public_html
example@test-azure-gen:~$ cd public_html
example@test-azure-gen:~/public_html$ cp /var/www/html/hello.html example.html
example@test-azure-gen:~/public_html$ vim example.html
我已经将其内容更改为如下。
<!DOCTYPE HTML>
<HTML><HEAD><META CHARSET=UTF-8><TITLE></TITLE></HEAD>
<BODY>
<H1>example Hello</H1>
</BODY>
</HTML>
http://<服务器IP地址>/~示例
我会在浏览器中尝试打开。

目前,显示 “未找到”。要将其设置为可见,按照以下方式进行设置。
例子是,退出当前用户并切换到azure-users用户。
example@test-azure-gen:/etc/apache2/mods-enabled$ exit
Apache 是一种功能丰富的服务器,各种功能通过模块提供,可以对每个模块进行启用/禁用。
用户可以使用UserDir模块来公开其本地public_html文件夹,并需要将其设置为enable。
我們將檢查目前在apache2中提供的模組清單。
azureuser@test-azure-gen:~$ cd /etc/apache2
azureuser@test-azure-gen:/etc/apache2$ ls
apache2.conf conf-available conf-enabled envvars magic mods-available mods-enabled ports.conf sites-available sites-enabled
azureuser@test-azure-gen:/etc/apache2$ ls mods-available/
access_compat.load authz_user.load dir.load log_debug.load proxy_connect.load session_crypto.load
actions.conf autoindex.conf dump_io.load log_forensic.load proxy_express.load session_dbd.load
actions.load autoindex.load echo.load lua.load proxy_fcgi.load setenvif.conf
alias.conf brotli.load env.load macro.load proxy_fdpass.load setenvif.load
alias.load buffer.load expires.load md.load proxy_ftp.conf slotmem_plain.load
allowmethods.load cache.load ext_filter.load mime.conf proxy_ftp.load slotmem_shm.load
asis.load cache_disk.conf file_cache.load mime.load proxy_hcheck.load socache_dbm.load
auth_basic.load cache_disk.load filter.load mime_magic.conf proxy_html.conf socache_memcache.load
auth_digest.load cache_socache.load headers.load mime_magic.load proxy_html.load socache_redis.load
auth_form.load cern_meta.load heartbeat.load mpm_event.conf proxy_http.load socache_shmcb.load
authn_anon.load cgi.load heartmonitor.load mpm_event.load proxy_http2.load speling.load
authn_core.load cgid.conf http2.conf mpm_prefork.conf proxy_scgi.load ssl.conf
authn_dbd.load cgid.load http2.load mpm_prefork.load proxy_uwsgi.load ssl.load
authn_dbm.load charset_lite.load ident.load mpm_worker.conf proxy_wstunnel.load status.conf
authn_file.load data.load imagemap.load mpm_worker.load ratelimit.load status.load
authn_socache.load dav.load include.load negotiation.conf reflector.load substitute.load
authnz_fcgi.load dav_fs.conf info.conf negotiation.load remoteip.load suexec.load
authnz_ldap.load dav_fs.load info.load php8.1.conf reqtimeout.conf unique_id.load
authz_core.load dav_lock.load lbmethod_bybusyness.load php8.1.load reqtimeout.load userdir.conf
authz_dbd.load dbd.load lbmethod_byrequests.load proxy.conf request.load userdir.load
authz_dbm.load deflate.conf lbmethod_bytraffic.load proxy.load rewrite.load usertrack.load
authz_groupfile.load deflate.load lbmethod_heartbeat.load proxy_ajp.load sed.load vhost_alias.load
authz_host.load dialup.load ldap.conf proxy_balancer.conf session.load xml2enc.load
authz_owner.load dir.conf ldap.load proxy_balancer.load session_cookie.load
用户目录().加载 存在。
您可以通过以下方式确认这些模块中已启用的模块。
azureuser@test-azure-gen:/etc/apache2$ ls mods-enabled/
access_compat.load authn_core.load authz_user.load deflate.load filter.load mpm_prefork.load php8.1.load setenvif.load
alias.conf authn_file.load autoindex.conf dir.conf mime.conf negotiation.conf reqtimeout.conf status.conf
alias.load authz_core.load autoindex.load dir.load mime.load negotiation.load reqtimeout.load status.load
auth_basic.load authz_host.load deflate.conf env.load mpm_prefork.conf php8.1.conf setenvif.conf
要启用,请使用a2enmod命令。
azureuser@test-azure-gen:/etc/apache2$ sudo a2enmod userdir
Enabling module userdir.
To activate the new configuration, you need to run:
systemctl restart apache2
为了使设置生效,请重新启动apache2。
azureuser@test-azure-gen:/etc/apache2$ sudo systemctl restart apache2
さて、ブラウザでリロードすると表示が変わりました。

这是因为/home/nanbuwks/public_html的权限没有公开。
azureuser@test-azure-gen:/etc/apache2$ su - example
Password:
example@test-azure-gen:~$ ls -alh
total 32K
drwxr-x--- 3 example example 4.0K Apr 8 04:13 .
drwxr-xr-x 4 root root 4.0K Apr 8 04:09 ..
-rw------- 1 example example 208 Apr 8 04:13 .bash_history
-rw-r--r-- 1 example example 220 Apr 8 04:09 .bash_logout
-rw-r--r-- 1 example example 3.7K Apr 8 04:09 .bashrc
-rw-r--r-- 1 example example 807 Apr 8 04:09 .profile
-rw------- 1 example example 901 Apr 8 04:11 .viminfo
drwxrwxr-x 2 example example 4.0K Apr 8 04:11 public_html
example@test-azure-gen:~$ cd public_html/
example@test-azure-gen:~/public_html$ ls -alh
total 12K
drwxrwxr-x 2 example example 4.0K Apr 8 04:11 .
drwxr-x--- 3 example example 4.0K Apr 8 04:13 ..
-rw-r--r-- 1 example example 119 Apr 8 04:10 example.html
example.html は 644, public_html は 775 になっています。この2つは大丈夫ぽいですね。
実は . が 750 になってました。ディレクトリの実行権を追加しないと、ディレクトリの中身が読めなくなっているます。apache2 は www-data ユーザで実行しているので、パーミッションの3桁目が 0 になっているということは実行権が無いのでその配下の public_html とか example.html にアクセス権があってもブラウザから読めないということになっています。
example@test-azure-gen:~/public_html$ cd ..
example@test-azure-gen:~$ chmod 751 .
这样,它可以在浏览器中显示出来了。

设置虚拟主机
apache で管理しているサイトは、モジュールと同じような考え方で enable / disable を個別に行います。
今回は、 example.com でアクセスすると /home/example/public_html の中身が見えるようにします。
azureuser@test-azure-gen:/etc/apache2$ ls sites-available/
000-default.conf default-ssl.conf
azureuser@test-azure-gen:/etc/apache2$ ls sites-enabled/
000-default.conf
复制000-default.conf文件,创建example.com的配置。
azureuser@test-azure-gen:/etc/apache2$ sudo cp sites-available/000-default.conf sites-available/example.com.conf
azureuser@test-azure-gen:/etc/apache2$ sudo vim sites-available/example.com.conf
我根据以下方式进行了内部设计。
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /home/example/public_html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
例子.com作为一个示例域名,在正常情况下将以以下方式显示。

域名信息如下所示。
我使用本地的PC(这次是Ubuntu 22.04机器)使用了dig命令。
$ dig example.com
; <<>> DiG 9.18.1-1ubuntu1.3-Ubuntu <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29884
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 5
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 55 IN A 93.184.216.34
;; AUTHORITY SECTION:
example.com. 55 IN NS b.iana-servers.net.
example.com. 55 IN NS a.iana-servers.net.
;; ADDITIONAL SECTION:
b.iana-servers.net. 55 IN AAAA 2001:500:8d::53
b.iana-servers.net. 55 IN A 199.43.133.53
a.iana-servers.net. 55 IN AAAA 2001:500:8f::53
a.iana-servers.net. 55 IN A 199.43.135.53
;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sat Apr 08 13:27:01 JST 2023
;; MSG SIZE rcvd: 192
我在本地计算机上使用Ubuntu 22.04。我已经按照以下方式编辑了它的/etc/hosts文件。
(Azure上バーチャルサーバのIPアドレス) example.com
(Azure上バーチャルサーバのIPアドレス) www.example.com
127.0.0.1 localhost
127.0.1.1 nanbuwks-B550M-S2H
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
最初の2行を追加しています。
(Azure上バーチャルサーバのIPアドレス) が 123.456.789.012 とすると、
123.456.789.012 example.com
123.456.789.012 www.example.com
这就是就是这个意思。
我会确认是否能够反映出来。
$ dig example.com
; <<>> DiG 9.18.1-1ubuntu1.3-Ubuntu <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21189
;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 0 IN A (Azure上バーチャルサーバのIPアドレス)
;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sat Apr 08 13:28:20 JST 2023
;; MSG SIZE rcvd: 56
重新加载浏览器。为了禁用缓存,使用 Shift 键进行了重新加载。

我可以看到/home/example/public_html的内容。