![新的 CentOS 7 安裝(Google Compute),無法將 VirtualHost 條目新增至 /etc/httpd/conf.d/](https://rvso.com/image/697404/%E6%96%B0%E7%9A%84%20CentOS%207%20%E5%AE%89%E8%A3%9D%EF%BC%88Google%20Compute%EF%BC%89%EF%BC%8C%E7%84%A1%E6%B3%95%E5%B0%87%20VirtualHost%20%E6%A2%9D%E7%9B%AE%E6%96%B0%E5%A2%9E%E8%87%B3%20%2Fetc%2Fhttpd%2Fconf.d%2F.png)
我剛剛進行了基本安裝,Apache 2.4 啟動得很好。我正在從運行 Apache 2.2 的舊伺服器遷移。
/etc/httpd/conf.d
當我將包含定義的檔案放入VirtualHost
並重新啟動伺服器時,它會在啟動時崩潰。這個 VirtualHost 定義是我在以前的伺服器上使用的。
# systemctl restart httpd.service
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
# systemctl -l status httpd.service
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Sun 2017-01-22 03:03:35 UTC; 10s ago
Docs: man:httpd(8)
man:apachectl(8)
Process: 20621 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=1/FAILURE)
Process: 20620 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
Main PID: 20620 (code=exited, status=1/FAILURE)
Jan 22 03:03:35 production-frontend-0 systemd[1]: Starting The Apache HTTP Server...
Jan 22 03:03:35 production-frontend-0 systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
Jan 22 03:03:35 production-frontend-0 kill[20621]: kill: cannot find process ""
Jan 22 03:03:35 production-frontend-0 systemd[1]: httpd.service: control process exited, code=exited status=1
Jan 22 03:03:35 production-frontend-0 systemd[1]: Failed to start The Apache HTTP Server.
Jan 22 03:03:35 production-frontend-0 systemd[1]: Unit httpd.service entered failed state.
Jan 22 03:03:35 production-frontend-0 systemd[1]: httpd.service failed.
#
這是conf檔案的內容(網域已更改):
<VirtualHost *:80>
ServerName mydomain.com
ServerAlias www.mydomain.com
<Directory /home/kenny/domains/mydomain.com/html>
Options Indexes FollowSymLinks MultiViews ExecCGI Includes
AllowOverride All
</Directory>
DocumentRoot /home/kenny/domains/mydomain.com/html
CustomLog /home/kenny/domains/mydomain.com/logs/access.log combined
ErrorLog /home/kenny/domains/mydomain.com/logs/error.log
ScriptAlias /cgi-bin /home/kenny/domains/mydomain.com/cgi
RewriteEngine on
# Does the file exist?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ http://mydomain.otherdomain.com [R,L]
</VirtualHost>
我檢查了文件語法:
# httpd -t
Syntax OK
#
如果我刪除該檔案並重新啟動,那麼 Apache 就會正常啟動。我已確保我的文件的權限與現有的 conf 檔案相符:
# ls -l
total 20
-rw-r--r--. 1 root root 2926 Nov 14 18:04 autoindex.conf
-rw-r--r--. 1 root root 366 Nov 14 18:05 README
-rw-r--r--. 1 root root 1252 Nov 14 16:53 userdir.conf
-rw-r--r--. 1 root root 674 Jan 22 03:03 vhost.mydomain.com.conf
-rw-r--r--. 1 root root 824 Nov 14 16:53 welcome.conf
#
Apache 2.4 中是否發生了與我的 VirtualHost 定義相衝突的變更?
標準 Google 運算實例中是否存在某種拒絕我的配置的安全措施?
是否有一些配置選項是我幾年前在我的舊伺服器上調整過的,而我只是忘記了我需要調整我的 Google 計算實例? :)
編輯:
在錯誤日誌中發現了這一點:
Permission denied: AH00649: could not open transfer log file /home/kenny/domains/mydomain.com/logs/access.log.
AH00015: Unable to open logs
我檢查了一下httpd.conf
,它說伺服器作為 User:Group 運行apache:apache
。因此,我執行了以下操作來確保 apache 有權寫入這些日誌檔案:
chgrp -R apache /home/kenny/domains
chmod g+w /home/kenny/domains/mydomain.com/logs
我仍然收到錯誤。我什至嘗試過:
touch /home/kenny/domains/mydomain.com/logs/access.log
chown kenny:apache /home/kenny/domains/mydomain.com/logs/access.log
chmod g+w /home/kenny/domains/mydomain.com/logs/access.log
仍然給我錯誤。我確保祖先路徑對於 apache 也是可執行的。
/home/kenny is owned by kenny:kenny and is 755
/home/kenny/domains is owned by kenny:apache and is 755
/home/kenny/domains/mydomain.com is owned by kenny:apache and is 755
/home/kenny/domains/mydomain.com/logs is owned by kenny:apache and is 775
/home/kenny/domains/mydomain.com/logs/access.log is owned by kenny:apache and is 664
審計日誌的內容:
type=AVC msg=audit(1485115416.525:2112): avc: denied { open } for pid=25759 comm="httpd" path="/home/kenny/domains/mydomain.com/logs/access.log" dev="sda1" ino=36516072 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file
type=SYSCALL msg=audit(1485115416.525:2112): arch=c000003e syscall=2 success=no exit=-13 a0=7f6620cd15a8 a1=80441 a2=1b6 a3=ffffff00 items=0 ppid=1 pid=25759 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
type=SERVICE_START msg=audit(1485115416.567:2113): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='unit=httpd comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=failed
'
答案1
您運行的是 CentOS 7,預設啟用 SELinux。
當您嘗試啟動 Apache 時,它會嘗試載入使用者主目錄中的文件,預設不允許這樣做。
您可以允許 Apache讀透過設定適當的布林值,在使用者主目錄中建立檔案httpd_read_user_content
。將網頁內容重新定位到更合適的位置(例如在/srv/www
或下)將是一個更好的主意/var/www
。
然而,沒有 SELinux 布林值允許 Web 伺服器寫使用者主目錄,這當然是危險的。您確實應該將日誌檔案移到其他地方。標準位置是/var/log/httpd
.如果用戶需要能夠閱讀它們,您可以為他們設定權限。