를 통해 직접 아파치를 시작할 수 있지만 httpd
를 통해 시작할 수는 없습니다 systemctl start httpd
. 나는 자동으로 시작할 수 있도록 데몬 접근 방식을 선호합니다.
이 문제가 발생한 사람이 있습니까? 이것은 새로운 CentOS7 가상 머신에 있습니다.
systemctl이 http를 시작합니다.
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
systemctl 상태 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 Tue 2018-03-20 17:20:54 EDT; 37s ago
Docs: man:httpd(8)
man:apachectl(8)
Process: 7025 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=1/FAILURE)
Process: 7024 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
Main PID: 7024 (code=exited, status=1/FAILURE)
Mar 20 17:20:54 test.local.com systemd[1]: Starting The Apache HTTP Server...
Mar 20 17:20:54 test.local.com systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
Mar 20 17:20:54 test.local.com kill[7025]: kill: cannot find process ""
Mar 20 17:20:54 test.local.com systemd[1]: httpd.service: control process exited, code=exited status=1
Mar 20 17:20:54 test.local.com systemd[1]: Failed to start The Apache HTTP Server.
Mar 20 17:20:54 test.local.com systemd[1]: Unit httpd.service entered failed state.
Mar 20 17:20:54 test.local.com systemd[1]: httpd.service failed.
로그 제어-xe
/etc/httpd/logs/error_log
기본 구성에 대한 유일한 변경 사항은 다음과 같습니다.
/etc/httpd/conf/httpd.conf
IncludeOptional sites-enabled/*.conf
/etc/httpd/sites-enabled/local.com.conf
<VirtualHost *:80>
ServerName test.local.com
ServerAlias local.com
Redirect / https://local.com
</VirtualHost>
<VirtualHost _default_:443>
ServerName test.local.com
ServerAlias local.com
ServerAdmin [email protected]
DocumentRoot /var/www/local.com/public_html
ErrorLog /var/www/local.com/error.log
CustomLog /var/www/local.com/access.log common
SSLEngine On
SSLCertificateFile /etc/ssl/certs/www/local.com.crt
SSLCertificateKeyFile /etc/ssl/certs/www/local.com.key
</VirtualHost>
열린 포트만:
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-dmc --reload
CentOS7을 새로 설치하면서 겪은 전체 프로세스는 다음과 같습니다.
Fresh CentOS 7 installation (VM)
yum upgrade -y
yum search http
yum install -y httpd httpd-devel mod_ssl openssl
systemctl start httpd
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload
Browse to 192.168.1.241
Apache is live!
yum search mariadb
yum install -y mariadb-server
systemctl start mariadb
mysql_secure_installation
mysql -uroot -p
Login to mysql server works!
yum search php
yum install -y php php-cli php-dba php-devel php-fpm php-mysql php-process php-pspell php-xml
systemctl restart httpd
Browse to 192.168.1.241/info.php
PHP is live!
mkdir /etc/httpd/sites-enabled
echo "IncludeOptional sites-enabled/*.conf" >> /etc/httpd/conf/httpd.conf
/etc/httpd/sites-enabled/local.com.conf
<VirtualHost *:80>
ServerName test.local.com
ServerAlias local.com
Redirect permenent / https://local.com
</VirtualHost>
<VirtualHost _default_:443>
ServerName test.local.com
ServerAlias local.com
ServerAdmin [email protected]
DocumentRoot /var/www/local.com/public_html
ErrorLog /var/www/local.com/error.log
CustomLog /var/www/local.com/access.log combined
SSLEngine On
SSLCertificateFile /etc/ssl/certs/www/local.com.crt
SSLCertificateKeyFile /etc/ssl/certs/www/local.com.key
</VirtualHost>
mkdir -p /var/www/local.com/public_html
chown -R apache:apache /var/www/local.com/public_html
chmod -R 755 /var/www
cd /etc/ssl/certs/www
openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout local.com.key -out local.com.crt
Browse to 192.168.1.241
Unsecure service (self signed ssl) accept
Site is live!
I was redirected to https://local.com
NOTE: I added the following to my desktop's (separate PC) /etc/hosts
192.168.1.241 test.local.com local.com
This acts as a DNS record for my site
yum install -y epel-release
yum install -y phpmyadmin
edit /etc/httpd/conf.d/phpMyAdmin.conf
Add under any line with Require ip 127.0.0.1 with
Require ip 192.168.1.5
Add under any line with Allow from 127.0.0.1 with
Allow from 192.168.1.5
systemctl restart httpd # FAILS
kill pid for httpd
httpd # start httpd directly
Access https://local.com/phpMyAdmin
Now have access to phpMyAdmin
Login with root, 12345
And have mariadb access!
yum install -y awstats
edit /etc/httpd/conf.d/awstats.conf
Change Require ip and Allow ip same as phpMyAdmin
cp /etc/awstats/awstats.localhost.localdomain.conf /etc/awstats/awstats.local.com.conf
edit /etc/awstats/awstats.local.com.conf
LogFile="/var/log/httpd/access.log"
SiteDomain="www.local.com"
HostAliases="local.com 127.0.0.1"
echo "*/30 * * * * root /usr/share/awstats/wwwroot/cgi-bin/awstats.pl -config=www.local.com -update" >> /etc/crontab
kill httpd pid
httpd
Browse to https://local.com/awstats/awstats.pl?config=local.com
Awstats is live!
답변1
SELinux를 사용하는 데 문제가 있습니다.
보안상의 이유로 CentOS 7에는 httpd가 그 아래의 파일에 쓰는 것을 방지하는 규칙이 제공됩니다 /var/www
.
VirtualHost의 로그 파일이 이 디렉토리 어딘가에 위치하도록 구성합니다.
ErrorLog /var/www/local.com/error.log
CustomLog /var/www/local.com/access.log combined
따라서 httpd(systemd에 의해 시작됨)가 이러한 로그 파일에 쓰려고 시도하면 SELinux는 이를 차단하여 궁극적으로 httpd가 잘못된 종료 코드로 종료되도록 합니다.
감사 로그(아래에 저장됨)의 항목을 ausearch
확인하는 다음 명령을 사용하여 이를 확인할 수 있습니다 ./var/log/audit/audit.log
$ sudo ausearch -m avc
type=AVC msg=audit(1234567890.123:234): avc: denied { write } for pid=12345 comm="httpd" name="local.com" dev="sda1" ino=12345678 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:httpd_sys_content_t:s0 tclass=dir
이 메시지에서는 쓰기 대상이 으로 표시되어 있음을 알 수 있습니다 httpd_sys_content_t
. ls -Z
로그 파일에 를 사용 하면 다음과 같이 표시된 것을 볼 수 있습니다.
$ ls -Z /var/www/local.com/
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 access.log
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 error.log
drwxr-xr-x. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 public_html
이것이 httpd를 직접 실행할 때가 아닌 systemd에 의해 시작될 때만 httpd에 영향을 미치는 이유는 SSH 세션이 "제한되지 않은" 도메인에서 실행되고 있으므로 거기에서 httpd를 실행하면 SELinux 전환이 트리거되지 않기 때문입니다... systemd를 통해 시작할 때, 데몬을 시작할 때 올바른 SELinux 권한을 적용합니다.
chcon
다음 명령을 사용하여 이러한 파일의 SELinux "유형"을 변경하면 이 문제를 해결할 수 있습니다.
$ sudo chcon -t httpd_log_t /var/www/local.com/*.log
$ ls -Z /var/www/local.com/
-rw-r--r--. root root unconfined_u:object_r:httpd_log_t:s0 access.log
-rw-r--r--. root root unconfined_u:object_r:httpd_log_t:s0 error.log
drwxr-xr-x. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 public_html
그 시점에서 systemctl을 통해 httpd를 시작하면 제대로 작동할 것입니다...
그러나 이는 좋은 해결책이 아닙니다. 이러한 파일이 다시 생성되거나(예: 로그 회전 중) 파일 시스템의 레이블이 다시 지정되면 SELinux 유형이 손실되기 때문입니다.
이 유형을 보다 지속적으로 만드는 방법이 있지만(예: 명령 semanage fcontext
) SELinux 정책이 여기서 달성하려는 것은 웹 콘텐츠와 로그의 혼합을 방지하고 실수로 로그 파일을 제공하거나 웹 콘텐츠를 덮어쓰는 것을 방지하는 것입니다.
/var/log/httpd
정답은 로그 파일을 이나 해당 디렉터리의 하위 디렉터리에 만드는 것입니다. 이렇게 하면 SELinux 유형이 처음부터 정확하고 모든 작업(SELinux 레이블 재지정 포함) 중에도 올바른 상태로 유지되며 모든 것이 예상대로 작동해야 합니다.
따라서 로그를 아래에 넣으면 /var/log/httpd
문제가 해결될 것입니다!