Centos7 http를 정상적으로 시작할 수 없습니다. httpd는 작동할 수 있지만 systemctl start httpd는 작동하지 않습니다.

Centos7 http를 정상적으로 시작할 수 없습니다. httpd는 작동할 수 있지만 systemctl start httpd는 작동하지 않습니다.

를 통해 직접 아파치를 시작할 수 있지만 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문제가 해결될 것입니다!

관련 정보