質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

3回答

1435閲覧

Apacheを"apachectl"で起動した場合と、"httpd -k"で起動した場合とで環境変数が異なるのはなぜ??

k-zil

総合スコア16

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

1グッド

0クリップ

投稿2020/02/02 07:31

編集2020/02/02 07:34

Macの環境(MacOS 10.14.6)において、Apacheを"sudo apachectl stop / start"で起動した場合と、"sudo httpd -k stop / start"で起動した場合とで、ウェブのプログラムの挙動が異なったので、いろいろ調べるとPATHなどの環境変数がそれぞれで異なっていました。

例えば、Perlにおいて、$ENVの内容を表示する以下のスクリプトを用意して、

$ pwd /Library/WebServer/CGI-Executables $ sudo vi printenv.cgi #!/usr/bin/perl print "Content-type: text/plain\n\n"; foreach $var (sort(keys(%ENV))) { $val = $ENV{$var}; $val =~ s|\n|\n|g; $val =~ s|"|\"|g; print "${var}=\"${val}\"\n"; }
  1. "sudo apachectl stop / start"でApacheを起動して上記のCGIをブラウザで実行すると、PATHは、

PATH="/usr/bin:/bin:/usr/sbin:/sbin"
となるのですが、

  1. "sudo httpd -k stop / start"でApacheを起動して同様のCGIを実行すると、

PATH="/usr/local/opt/mariadb@10.1/bin:/Users/hogehoge/.pyenv/shims:/Users/hogehoge/.pyenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin"
と、Macにログインしているユーザーアカウントの環境変数PATHの値になります。

※CGIをブラウザで実行した際のURLは、http://localhost/cgi-bin/printenv.cgiです。

当初、"sudo apachectl stop / start"でApacheの制御をしていたのですが、追加したモジュールに関するパスが通らずプログラムがエラーで止まってしまいました。
そこで試行錯誤しているうちに、"sudo httpd -k stop / start"でApacheを制御すると、パスが通って無事にプログラムが走ることに気が付きました。

今後のためにも、"apachectl"コマンドと"httpd"コマンドによるApache起動の違いを理解したく、いろいろ調べましたが明確な答えにたどり着けませんでした。

どなたか、"apachectl"コマンドと"httpd"コマンドによるApache起動の差、特に適用される環境変数がなぜこの2つの起動方法で異なるのか教えていただけないでしょうか。

よろしくお願いいたします。

補足

元々はPerlではなく、PythonのフレームワークDjangoとApache+mod_wsgiでMacローカル上でプログラムを作成している際に、上記の現象に遭遇しました。
この場合、環境変数の確認は以下の内容をブラウザに表示させる方法で確認しました。

python

1import subprocess 2proc = subprocess.run(["printenv"],stdout = subprocess.PIPE, stderr = subprocess.PIPE) 3context["cmd_result"] = proc.stdout.decode("utf8") #このcontext["cmd_result"]の値を画面に表示してPATHの内容を確認

この場合も、"apachectl"コマンドと"httpd"コマンドによるApache起動方法の違いでPATHの内容が、上記の1と2のように異なります。

各種バージョン

MacOS : 10.14.6
Apache : 2.4.34
perl : 5.18.4
Python : 3.6.5
Django : 2.1
mod_wsgi : 4.6.8

yodel👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

公式ドキュメントに下記の通り記載がありますがご覧になっていますか。

推奨の httpd 実行プログラムの起動方法は、 apachectl 制御スクリプトを使用する方法です。このスクリプトは、httpd がオペレーティングシステム上で正常に動作するように必要な環境変数を 適切に設定して、httpd バイナリを起動します。

Apache の起動

投稿2020/02/03 01:08

yukky1201

総合スコア2751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k-zil

2020/02/12 07:52 編集

このApache公式ページは読みました。 「このスクリプトは、・・・・必要な環境変数を適切に設定して」の文で「適切に設定」とあるのですが、私が遭遇したケースの場合だと、apachectlによって設定された内容だと、PATHが通っておらずプログラムがちゃんと動作せず、むしろ、httpdを直接起動した方が、プログラムが期待する環境変数(PATH)が設定されるので、apachectlでの起動の方が「不適切」で、httpdでの直接起動の方が「適切」ということになります。 しかしながら、この「適切な設定」にはPATH以外の設定のことも含まれているのだと思います。サーバのセキュリティに関することが含まれているかもしれないので、やはりhttpd直接起動よりapachectlで起動した方が安心できそうですね。(私の場合、Macでの環境はあくまで開発環境であり、常時ネットにさらしているわけではないのでそこまでシビアではないですが。) そこで、Apacheの公式ページで言っているこの「適切に設定」の内容が、どういう設定内容で、どのような流れで設定されるか理解する必要があるな、といろいろ調べたのですが、行き詰まったため、こちらで質問させていただきました。 ただ、ご回答をいただいて、改めて上記のApache公式ページを見て、さらに突っ込んで調べていくと、 /System/Library/LaunchDaemons/org.apache.httpd.plist の内容をapachectlが参照するようなので、そこにPATHの設定を追記することで上手く動きました。 この詳細は後ほど自己回答として投稿したいと思います。 ご指摘・ご指南いただきありがとうございました。
退会済みユーザー

退会済みユーザー

2020/02/12 08:17

適切に×だと不足してる。 ユーザーの事前操作に影響無く適切に○だと言うべき。 ユーザーの事前操作が必要なものは、シェルスクリプト等を修正して固定的な環境変数の設定を行う
guest

0

Macは持ってませんが、apachectlはシェルスクリプト、httpdはバイナリーだと思います。
httpdだと起動時の環境変数を引き継いで、apachectlだとスクリプト内で環境変数を設定しなおしているのではないかと思います。
起動時の環境変数は、
sudo envでわかると思います。

投稿2020/02/02 10:34

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k-zil

2020/02/12 07:46

別回答でyukky1201さんがリンクされたApache公式ページにも、「apachectl スクリプトを直接編集し・・・」とあるので、 /usr/sbin/apachectl の内容を見てみました。シェルスクリプトに疎いのであれこれ調べていると、 /System/Library/LaunchDaemons/org.apache.httpd.plist に希望する環境変数をセットするとよい、というような記事を見つけたので、そのとおりやってみたら上手くいったぽいです。 詳細は後ほど自己回答として投稿したいと思います。 ヒントをいただきありがとうございました。
guest

0

自己解決

yukky1201さん、otnさんから頂いた回答を参考にいろいろ調べると、「apachectlは、適切な設定内容でhttpdを起動するためのシェルであり、PATHなどの環境変数を変えたい場合はapachectlに関する設定変更をするべき」という理解に落ち着きました。

また、さらに調べていくと以下のようなウェブページを見つけました。

'Configure Apache Path Environment Variable on Mac OSX'
https://gist.github.com/srayhunter/5208619

これを見ると、apachectlのPATHの設定を変更したい場合、
/System/Library/LaunchDaemons/org.apache.httpd.plist
を編集すればよいようです。

実際に、PATHに関する好みの設定をこのファイルに追記して、apachectlでApacheを起動して、質問にあるprintenv.cgiで環境変数の値を見ると、確かに希望する環境変数PATHが反映されていました。

apachectlのファイルである、
/usr/sbin/apachectl
の中身を見ると、
/System/Library/LaunchDaemons/org.apache.httpd.plist
を参照している記述があるので、apachectlの設定内容を変える方法としては、
/System/Library/LaunchDaemons/org.apache.httpd.plist
を編集することが一つの解であると思って良さそうです。

なお、今回、
/System/Library/LaunchDaemons/org.apache.httpd.plist
に追記したのは以下の内容です。

<dict> <key>EnvironmentVariables</key> <dict> <key>PATH</key> <string>/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin</string> </dict> </dict>

追記した結果の
/System/Library/LaunchDaemons/org.apache.httpd.plist
の全体の内容は以下のとおりです。

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Disabled</key> <true/> <key>Label</key> <string>org.apache.httpd</string> <key>EnvironmentVariables</key> <dict> <key>XPC_SERVICES_UNAVAILABLE</key> <string>1</string> <key>OBJC_DISABLE_INITIALIZE_FORK_SAFETY</key> <string>YES</string> <key>PATH</key> <string>/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin</string> </dict> <key>ProgramArguments</key> <array> <string>/usr/sbin/httpd-wrapper</string> <string>-D</string> <string>FOREGROUND</string> </array> <key>OnDemand</key> <false/> </dict> </plist>

お陰様でMacにおけるApache起動に関する理解が深まりました。
ありがとうございました。

投稿2020/02/26 02:03

k-zil

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問