1. ホーム
  2. Qt

Apacheのコンパイルとインストール、共通設定

2022-02-26 04:58:06
<パス

Apacheのコンパイルとインストール、共通設定

httpd-2.4 のコンパイルとインストール

apache と、apache が依存する必要な rpm パッケージをダウンロードします。

[root@localhost ~]# wget https://archive.apache.org/dist/apr/apr-1.7.0.tar.bz2
--2021-04-20 19:50:58-- https://archive.apache.org/dist/apr/apr-1.7.0.tar.bz2
Resolving archive.apache.org (archive.apache.org)... 138.201.131.134, 2a01:4f8:172:2ec5::2
Connecting to archive.apache.org (archive.apache.org)|138.201.131.134|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 872238 (852K) [application/x-bzip2]
Saving to: 'apr-1.7.0.tar.bz2'
apr-1.7.0.tar.b 100%[=======>] 851.79K 714KB/s in 1.2s    
2021-04-20 19:51:00 (714 KB/s) - 'apr-1.7.0.tar.bz2' saved [872238/872238]
[root@localhost ~]# wget https://archive.apache.org/dist/apr/apr-util-1.6.1.tar.bz2
--2021-04-20 19:51:34-- https://archive.apache.org/dist/apr/apr-util-1.6.1.tar.bz2
Resolving archive.apache.org (archive.apache.org)... 138.201.131.134, 2a01:4f8:172:2ec5::2
Connecting to archive.apache.org (archive.apache.org)|138.201.131.134|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 428595 (419K) [application/x-bzip2]
Saving to: 'apr-util-1.6.1.tar.bz2'
apr-util-1.6.1. 100% [=======>] 418.55K 227KB/s in 1.8s    
2021-04-20 19:51:36 (227 KB/s) - 'apr-util-1.6.1.tar.bz2' saved [428595/428595]
[root@localhost ~]# wget https://archive.apache.org/dist/httpd/httpd-2.4.43.tar.bz2
--2021-04-20 19:53:30-- https://archive.apache.org/dist/httpd/httpd-2.4.43.tar.bz2
Resolving archive.apache.org (archive.apache.org)... 138.201.131.134, 2a01:4f8:172:2ec5::2
Connecting to archive.apache.org (archive.apache.org)|138.201.131.134|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7155865 (6.8M) [application/x-bzip2]
Saving to: 'httpd-2.4.43.tar.bz2'
httpd-2.4.43.ta 100%[=======>] 6.82M 1.58MB/s in 5.6s    
2021-04-20 19:53:37 (1.21 MB/s) - 'httpd-2.4.43.tar.bz2' saved [7155865/7155865]
[root@localhost ~]# ls
anaconda-ks.cfg apr-util-1.6.1.tar.bz2
apr-1.7.0.tar.bz2 httpd-2.4.43.tar.bz2


コンパイラのインストール、必要なツールなど。

[root@localhost ~]# dnf -y install gcc gcc-c++ pcre-devel zlib-devel openssl openssl-devel make expat-devel libtool


rpmパッケージの解凍

[root@localhost ~]# tar xf apr-1.7.0.tar.bz2 
[root@localhost ~]# tar xf apr-util-1.6.1.tar.bz2
[root@localhost ~]# tar xf httpd-2.4.43.tar.bz2
[root@localhost ~]# ls
anaconda-ks.cfg apr-util-1.6.1 httpd-2.4.43.tar.bz2
apr-1.7.0 apr-util-1.6.1.tar.bz2
apr-1.7.0.tar.bz2 httpd-2.4.43


httpd は apr-util-1.6.1 に依存し、apr-util-1.6.1 は apr-1.7.0 に依存しているので、インストール順序は apr-1.7.0, apr-util-1.6.1, httpd-2.4.43 となります。

pr-1.7.0 の configure で RM "$cfgfile" を削除またはコメントアウトする。

apr-1.7.0のビルド環境をテストします。

[root@localhost apr-1.7.0]# . /configure --prefix=/usr/local/apr


apr-1.7.0をコンパイルしてインストールします。

[root@localhost apr-1.7.0]# make
[root@localhost apr-1.7.0]# make install


apr-util-1.6.1.tar.bz2 のビルド環境を確認する。

[root@localhost apr-util-1.6.1]# . /configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr


apr-util-1.6.1のコンパイルとインストール

[root@localhost apr-util-1.6.1]# make
[root@localhost apr-util-1.6.1]# make install


apacheのビルド環境を確認し、必要な機能を設定します。

[root@localhost httpd-2.4.43]# . /configure --prefix=/usr/local/apache \
--sysconfdir=/etc/httpd24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util/ \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork


apacheのコンパイルとインストール

[root@localhost httpd-2.4.43]# make
[root@localhost httpd-2.4.43]# make install


httpd.service ファイルに以下のコードを記述し、etc/systemd/system/ ディレクトリに格納します。

[root@localhost system]# vim /etc/systemd/system/httpd.service

Description=Start httpd
[Service]
Type=simple
EnvironmentFile=/etc/httpd24/httpd.conf
ExecStart=/usr/local/apache/bin/httpd -k start -DFOREGROUND
ExecReload=/usr/local/apache/bin/httpd -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
[Install]
WantedBy=multi-user.target



apacheを起動します。

[root@localhost system]# systemctl start httpd
[root@localhost system]# systemctl status httpd
httpd.service
   Loaded: loaded (/etc/systemd/system/httpd.service; disabled;>
   Active: active (running) since Tue 2021-04-20 20:34:47 CST; >
 Main PID: 53212 (httpd)
    Tasks: 6 (limit: 8756)
   Memory: 4.9M
   CGroup: /system.slice/httpd.service
           ├─53212 /usr/local/apache/bin/httpd -k start -DFOREG>
           ├─53213 /usr/local/apache/bin/httpd -k start -DFOREG>
           ├─53214 /usr/local/apache/bin/httpd -k start -DFOREG>
           ├─53215 /usr/local/apache/bin/httpd -k start -DFOREG>
           ├─53216 /usr/local/apache/bin/httpd -k start -DFOREG>
           └─53217 /usr/local/apache/bin/httpd -k start -DFOREG>
Apr 20 20:34:47 localhost.localdomain systemd[1]: Started http>
Apr 20 20:34:47 localhost.localdomain httpd[53212]: AH00558: h>


ファイアウォールとselinuxをオフにする

[root@localhost ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0


80番ポートが開いているかどうか確認する

[root@localhost system]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process           
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*                               
LISTEN 0 128 *:80 *:*                               
LISTEN 0 128 [::]:22 [::]:*     


Apacheの共通設定

ソースインストールの場合、httpdコマンドが見つからないため、直接使用することができません。etc/profile.d/ ディレクトリに httpd.sh スクリプトを作成し、そこに apache インストールの絶対パス(環境変数の設定)を記述する必要があります。
MPMへの切り替え(/etc/httpd/conf.modules.d/00-ppm.confファイルを編集します。)
動作モードは次の3つです。

  • プリフォーク
  • イベント
  • ワーカー

コンパイルしてインストールすると、モデルが設定され、変更できなくなりますが、設定を変更することは可能です

[root@localhost /]# vim /etc/httpd24/extra/httpd-mpm.conf
......
StartServers 5 //Start five processes at startup
MinSpareServers 5 // start a minimum of five processes
MaxSpareServers 10 //Start up to ten processes
MaxRequestWorkers 250 //Request process connections up to 250
MaxConnectionsPerChild 0 //maximum number of connections per child process, 0 means no limit
......


アクセス制御に関する法律。

<テーブル 法 機能 全ての付与を要求する すべてのホストへのアクセスを許可する 全拒否を要求する すべてのホストからのアクセスを拒否する ip IPADDRを要求する 指定された送信元アドレスを持つホストへのアクセスを許可する IPADDRでないことを要求する 指定された送信元アドレスを持つホストからのアクセスを拒否する 必要なホスト HOSTNAME 指定されたソースホスト名を持つホストへのアクセスを許可します。 ホストでないことを要求する HOSTNAME 指定された送信元ホスト名のホストへのアクセスを拒否する <テーブル IPADDRの種類 HOSTNAMEの種類 ip: 192.168.1.1
ネットワーク/マスク 192.168.1.0/255.255.255.0
ネットワーク/長さ: 192.168.1.0/24
ネット 192.168 FQDN:特定ホストのフルネーム
DOMAIN:指定されたドメインに含まれるすべてのホスト

注意:httpd-2.4はデフォルトですべてのホストへのアクセスを拒否しているので、後でインストールするときは認証されたアクセスを表示する必要があります。

<Directory /var/www/html/www> //directory address
    <RequireAll>										
        Require not ip 192.168.1.20 //deny ip access to 192.168.1.20
        Require all granted //All host access allowed
    </RequireAll>
</Directory>
<Directory />
    AllowOverride none								
    Require all denied //Deny access to all hosts
</Directory>
<Directory "/usr/local/apache/htdocs"> //httpd's site's root directory
    Options Indexes FollowSymLinks
    Require all granted //All hosts are allowed to access
</Directory>



ウェブホストの設定

バーチャルホストの種類は3つあります。

  • 同じIPで異なるポート
  • 異なるIP、同じポート
  • 同じIPアドレス、同じポート、異なるドメイン名(一般的な方法)。

設定する前にバーチャルホストを設定する
まず、メイン設定ファイルの vhosts.conf 行のコメントを解除して、apache の httpd-vhosts.conf を有効にします。

[root@localhost htdocs]# vim /etc/httpd24/httpd.conf 
Include /etc/httpd24/extra/httpd-vhosts.conf


httpd-vhosts.conf 設定パラメータの意味

<VirtualHost *:80> //virtual host address and port number
    ServerAdmin [email protected] //admin email     	 		
    DocumentRoot "/usr/local/apache/docs/dummy-host.example.com" //root directory of the website	
    ServerName dummy-host.example.com //the domain name of the website
    ServerAlias www.dummy-host.example.com // Alias of the website
    ErrorLog "logs/dummy-host.example.com-error_log" //error log storage address, logs in the apache root directory
    CustomLog "logs/dummy-host.example.com-access_log" common (fixed write) //logs for normal access
</VirtualHost>


同じipでも、以下のようにポート設定するとうまくいきません。

同じipで異なるポートを持つバーチャルホストを設定する

<VirtualHost *:80>
    DocumentRoot "/usr/local/apache/htdocs/test1"
    ServerName test1.com
    ErrorLog "logs/test1.com-error_log"
    CustomLog "logs/test1.com-access_log" common
</VirtualHost>

listen 81
<VirtualHost *:81>
    DocumentRoot "/usr/local/apache/htdocs/test2"
    ServerName test2.com
    ErrorLog "logs/test2.com-error_log"
    CustomLog "logs/test2.com-access_log" common
</VirtualHost>


サービスを再起動し、同じIPと異なるポートからアクセスします。

[root@localhost htdocs]# systemctl restart httpd
[root@localhost htdocs]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process            
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*                                  
LISTEN 0 128 *:80 *:*                                  
LISTEN 0 128 *:81 *:*                                  
LISTEN 0 128 [::]:22 [::]:*                                  


テストページです。

異なるip同一ポートの設定方法。

まず、NICに2つのipを設定し、NICを再起動します。

[root@localhost htdocs]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# ls
ifcfg-ens33
[root@localhost network-scripts]# vim ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR1=192.168.247.137
PREFIX1=24
GATEWAY=192.168.247.2
DNS1=114.114.114.114
IPADDR2=192.168.247.100
PREFIX2=24
[root@localhost network-scripts]# ifdown ens33;ifup ens33
[root@localhost network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:4b:b2:69 brd ff:ff:ff:ff:ff:ff:ff
    inet 192.168.247.137/24 brd 192.168.247.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.247.100/24 brd 192.168.247.255 scope global secondary noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe4b:b269/64 scope link 
       valid_lft forever preferred_lft forever


異なるIPと同じポートを持つバーチャルホストを設定し、サービスを再起動します。

[root@localhost htdocs]# vim /etc/httpd24/extra/httpd-vhosts.conf 
<VirtualHost 192.168.247.137:80>
    DocumentRoot "/usr/local/apache/htdocs/test1"
    ServerName test1.com
    ErrorLog "logs/test1.com-error_log"
    CustomLog "logs/test1.com-access_log" common
</VirtualHost>

<VirtualHost 192.168.247.100:80>
    DocumentRoot "/usr/local/apache/htdocs/test2"
    ServerName test2.com
    ErrorLog "logs/test2.com-error_log"
    CustomLog "logs/test2.com-access_log" common
</VirtualHost>
root@localhost htdocs]# systemctl restart httpd


テストページです。

ドメイン名が以下のように設定されている場合、同じip同じportは動作しません。

同一ip同一portのドメイン名なし設定。

[root@localhost htdocs]# vim /etc/httpd24/extra/httpd-vhosts.conf 
<VirtualHost 192.168.247.137:80>
    DocumentRoot "/usr/local/apache/htdocs/test1"
    ServerName test1.com
    ErrorLog "logs/test1.com-error_log"
    CustomLog "logs/test1.com-access_log" common
</VirtualHost>
<VirtualHost 192.168.247.100:80>
    DocumentRoot "/usr/local/apache/htdocs/test2"
    ServerName test2.com
    ErrorLog "logs/test2.com-error_log"
    CustomLog "logs/test2.com-access_log" common
</VirtualHost>
<VirtualHost 192.168.247.100:80>
    DocumentRoot "/usr/local/apache/htdocs/test3"
    ServerName test3.com
    ErrorLog "logs/test3.com-error_log"
    CustomLog "logs/test3.com-access_log" common
</VirtualHost>
[root@localhost htdocs]# systemctl restart httpd


バーチャルホストのドメイン名をローカルで解決するために、hostsファイルを修正します。
C:³³をデスクトップにドラッグし、管理者として開き、ドメイン名とipを以下のフォーマットで記述します。
192.168.247.100 test2.com test3.com
最後に、hosts ファイルをドラッグして元のディレクトリに戻します。
テストページです。

CA証明書の設定(https)

ssl モジュールを有効にする。
etc/httpd24/httpd.confファイルを編集し、以下の2行を見つけてコメントを解除してください。

LoadModule ssl_module modules/mod_ssl.so
Include /etc/httpd24/extra/httpd-ssl.conf


httpd-ssl.confファイルのパラメータの意味

<VirtualHost _default_:443>
# General setup for the virtual host
DocumentRoot "/usr/local/apache/htdocs" //root of https site
ServerName www.example.com:443 //domain name
ServerAdmin [email protected] //administrator email
ErrorLog "/usr/local/apache/logs/error_log" // path to error log file
TransferLog "/usr/local/apache/logs/access_log" //correct log file path


httpd-ssl.conf設定ファイルを修正します。

<VirtualHost _default_:443>
# General setup for the virtual host
DocumentRoot "/usr/local/apache/htdocs/test2"
ServerName test2.com:443
ErrorLog "/usr/local/apache/logs/test2.com-error_log"
TransferLog "/usr/local/apache/logs/test2.com-access_log"
......
SSLCertificateFile "/etc/httpd24/httpd.crt" //set the certificate placement address
......
SSLCertificateKeyFile "/etc/httpd24/httpd.key" //Set the certificate placement address
......


を変更した後に構文エラーをチェックします。

[root@localhost network-scripts]# apachectl -t
AH00526: Syntax error on line 92 of /etc/httpd24/extra/httpd-ssl.conf:
SSLSessionCache: 'shmcb' session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).
[root@localhost network-scripts]# vim /etc/httpd24/extra/httpd-ssl.conf
 #SSLSessionCache "shmcb:/usr/local/apache/logs/ssl_scache
    (512000)"
//because there is no /usr/local/apache/logs/ssl_scache file just comment it out
//compile again with an error because our certificate has not yet been generated to the target directory


CAが生成した鍵

[root@localhost CA]# mkdir private
[root@localhost CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048) 
Generating RSA private key, 2048 bit long modulus (2 primes)
........................ +++++
............... +++++
e is 65537 (0x010001)



CAが自己署名入り証明書を生成

[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.' , the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HB
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:ha
Organizational Unit Name (eg, section) []:ha
Common Name (eg, your name or your server's hostname) []:test2.com
Email Address []:[email protected]


クライアント側で生成されたキー

[root@localhost CA]# mkdir certs newcerts crl
[root@localhost CA]# touch index.txt && echo 01 > serial
[root@localhost CA]# (umask 077;openssl genrsa -out httpd.key 2048)
Generating RSA private key, 2048 bit long modulus (2 primes)
............................. +++++
 .......................................................................................................................................... +++++
e is 65537 (0x010001)



クライアントが証明書署名要求を生成

[root@localhost CA]# openssl req -new -key httpd.key -days 365 -out httpd.csr
Ignoring -days; not generating a certificate
You are about to be asked to enter information that will be incorporated
You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.' , the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HB
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:ha
Organizational Unit Name (eg, section) []:ha
Common Name (eg, your name or your server's hostname) []:test2.com
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


CA は、クライアントから提出された証明書に署名する

[root@localhost CA]# openssl ca -in httpd.csr -out httpd.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Apr 27 09:28:43 2021 GMT
            Not After : Apr 27 09:28:43 2022 GMT
        Subject:
            countryName = CN
            stateOrProvinceName = HB
            organizationName = ha
            organizationalUnitName = ha
            commonName = test2.com
            emailAddress = [email protected]
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                70:0C:C7:BB:B4:AB:09:53:3D:2A:97:CA:3A:C9:78:F9:C5:7B:99:3E
            X509v3 Authority Key Identifier: 
                keyid:B0:D2:2C:1C:EE:3D:D5:75:E8:A7:09:DF:04:DA:48:50:50:DE:42:6E

Certificate is to be certified until Apr 27 09:28:43 2022 GMT (365 days)
Sign the certificate?


1 out of 1 certificate requests certified, commit?
Write out database with 1 new entries
Data Base Updated


証明書をセットディレクトリに移動する

[root@localhost CA]# mv httpd.key httpd.crt /etc/httpd24/
[root@localhost CA]# systemctl restart httpd


テストページです。