AmazonLinux2でApache(httpd)に環境変数を読ませる方法 

環境変数の設定をする時、普通は`/etc/environments`に書いたりapacheの場合confファイルに`SetEnv`で書いたりしますが、私のAmazonLinux2上では何故かあらゆる方法を試しても環境変数に反映されなかったので、その対処方法を記載します。

まずは環境変数の確認（↓を参考にしています）

https://tech.akat.info/?p=1839

まずはhttpdプロセスの番号を確認(pidofとか使えば一行で書けそうだが)

```bash
# ps afx|grep httpd
 7801 pts/0    S+     0:00                      \_ grep --color=auto httpd
 7753 ?        Ss     0:00 /usr/sbin/httpd -DFOREGROUND
 7754 ?        Sl     0:00  \_ /usr/sbin/httpd -DFOREGROUND
 7756 ?        Sl     0:00  \_ /usr/sbin/httpd -DFOREGROUND
```

適当なidから環境変数を取得(一番上はgrep自身なのでそれ以外)

```bash
# sed -e 's/\x0/\n/g' /proc/7753/environ
LANG=C
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
NOTIFY_SOCKET=/run/systemd/notify
```

こんな感じで普段何もせず入っているHOSTNAMEやらLANGやらの環境変数すら入ってない。

# 解決方法

→systemctlの設定ファイルに環境変数設定ファイルのパスを追記してファイルの方に環境変数を書く

statusを打つとhttpd.serviceの場所がわかる


```bash
 # systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2021-04-19 05:04:04 UTC; 30min ago
     Docs: man:httpd.service(8)
 Main PID: 7899 (httpd)
   Status: "Total requests: 376; Idle/Busy workers 100/0;Requests/sec: 0.208; Bytes served/sec: 840 B/sec"
   CGroup: /system.slice/httpd.service
           ├─7899 /usr/sbin/httpd -DFOREGROUND
           ├─7900 /usr/sbin/httpd -DFOREGROUND
```

~~loadedにある`/usr/lib/systemd/system/httpd.service`という所~~
**（2021/05/10追記）/usr/配下はyum update時に上書きされてしまうので/etcにファイルをコピーしてそちらを編集したほうが良い**

```
rm /etc/systemd/system/multi-user.target.wants/httpd.service
cp /usr/lib/systemd/system/httpd.service /etc/systemd/system/httpd.service
```

このファイルを適当なエディタで開いて追記する

```
# vi /etc/systemd/system/httpd.service

[Unit]
Description=The Apache HTTP Server
Wants=httpd-init.service
After=network.target remote-fs.target nss-lookup.target httpd-init.service
Documentation=man:httpd.service(8)

[Service]
Type=notify

# コメントアウト
# Environment=LANG=C

# ここを追記
EnvironmentFile=/etc/sysconfig/httpd

ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
# Send SIGWINCH for graceful stop
KillSignal=SIGWINCH
KillMode=mixed
PrivateTmp=true

[Install]
WantedBy=multi-user.target

```

`/etc/sysconfig/httpd`を新たに作成して環境変数を設定

```bash
# vi /etc/sysconfig/httpd
## ↓のように[変数名]=[値]の形式で入れたい変数を記入

LANG=C
ENV=HOGE
DATABASE=FUGA
```

systemctlをリロード(.serviceを編集した場合はやらないとだめらしい)して、`httpd`プロセスを再起動

```bash
# systemctl daemon-reload
# systemctl restart httpd
```

またプロセスの環境変数を調べて入っていることを確認

```bash
# ps afx|grep httpd
 7947 pts/0    S+     0:00                     \_ grep --color=auto httpd
 7899 ?        Ss     0:00 /usr/sbin/httpd -DFOREGROUND
 7900 ?        Sl     0:00  \_ /usr/sbin/httpd -DFOREGROUND
 7902 ?        Sl     0:00  \_ /usr/sbin/httpd -DFOREGROUND


# sed -e 's/\x0/\n/g' /proc/7899/environ
LANG=C
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
NOTIFY_SOCKET=/run/systemd/notify
ENV=HOGE
DATABASE=FUGA
```

自動起動にする場合は普通に下記を打てばよい。
(シンボリックリンクが作られるが、コピーしたファイルが優先して読まれるはず)

```bash
# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /etc/systemd/system/httpd.service.
```

AWS的にはパラメータストアのパスを設定ファイルとかで設定して、環境変数系は全部そっちから読ませてローカルには入れないのが正解なのでしょうが…（それゆえこんな複雑なのかもしれないですが）
とはいえデバッグ等で取り急ぎローカルで環境変数入れたい場合もあるかと思うので、参考になれば。

<font color="Gray">`/etc/init.d`時代とrestartとかの文法が逆になってるのがどうも慣れない。
</font>