**質問１**  
レンタルサーバで環境変数の利用は一般的ではないのでしょうか？  
環境変数を使用したい場合、VPSやAWSなどのクラウドを使う方がセキュアに運用できそうでしょうか？

**調査した事１**  
某レンタルサーバさんのサポートに問い合わせたところサポート対象外との回答をいただきました。

**調査した事２**  
「レンタルサーバ 環境変数 設定」などのワードで検索してみたところ  
レンタルサーバで環境変数を設定する方法が公式で説明されているものはなく、解説記事も少なかったので今回の質問に至りました。

**実現したいこと**  
GoogleのPlaces APIを使用してマップ内に動的にピンを複数打ちたいと考えています。  
その際に使用するAPIキーの保存場所を検討しているところです。

不足情報がありましたら可能な限り補足させていただきます。  
よろしくお願い致します。

またもしレンタルサーバで環境変数を使用しながら  
運用しているという方もいらっしゃいましたらぜひその方法をご教授いただけましたら幸いです。
CC BY-SA 4.0
2022-09-23T09:22:28.073
91256
2022-09-24T03:25:03.920
2022-09-24T03:25:03.920
3060
19992
question
php linux
レンタルサーバで環境変数の利用は一般的ではないのでしょうか？
いわゆるレンタルサーバー(Webホスティングサービスの一種であり、共有サーバーとも言われる)では、一つのWebサーバーアプリ(Apache HTTP
Serverやnginx)上で独立した複数のユーザーのサイトを動かしています。それぞれのユーザーのサイトはお互いに見えず、実行環境もsuEXEC等の技術でそのユーザーの権限に落とし込んだり、chrootで隔離されたりしていますが、もともとは一つのWebサーバーアプリからフォークして実行されます。

通常、環境変数を渡すとなると、大本のプロセス、つまり、systemdのユニットファイルで`Environment`を設定する等でWebサーバーアプリに渡します。しかし、Webサーバーアプリは一つしか無いため、一人のユーザーのために環境変数を設定したら、それは全てのユーザーと共有されてしまいます。これは、ユーザー毎に独立した環境を提供するレンタルサーバーとしては、一種のセキュリティホールになってしまいます。また、ユーザー同士で設定したい環境変数が重複した場合、どちらを優先するかで揉めることになるでしょう。

では、どうやってもできないかというと、そうではありません。Apache HTTP
Serverであれば、[`SetEnv`ディレクティブ](https://httpd.apache.org/docs/2.4/ja/mod/mod_env.html#setenv)というのがあります。これは任意の環境変数を設定できるというもので、サーバー全体だけでは無く、ホスト毎やディレクトリ毎に設定できます。先程の問題はWebサーバーアプリに環境変数を設定すると全ユーザー共通になってしまうと言うことでした。ですが、これであれば、サイト(バーチャルホスト)毎やディレクトリ毎に任意の環境変数を設定できそうです。しかし、まだ問題があります。これらはApache
HTTP Serverの設定になるのですが、それをユーザーに変更させるのは難しいですし、変更の度にサービス再起動する必要があるのも問題です。

まだ、諦めないで下さい。なんと、`SetEnv`は`.htaccess`でも使用できます。`.htaccess`はユーザー毎、もっと正確に言えば、公開するディレクトリ毎に設定できます。プログラムが置いてあるところのディレクトリに`.htaccess`を置いて、そこに`SetEnv`を使えば、任意の環境変数を使えると言うことです。これなら、ユーザーは自分の領域で自由に設定できますし、サービス再起動などの面倒な事も不要になります。ただ一つ問題があるとすれば、`.htaccess`は使用できるディレクティブを制限している場合があると言うことです。(`.htaccess`で使用できるディレクティブはApache
HTTP Serverの設定で制限できます)

* * *

前置きが長くなりました。次の条件を満たすレンタルサーバーであれば、環境変数は使えます。

  * `.htaccess`が使用できる。
  * `.htaccess`での`SetEnv`ディレクティブの使用が許可されている。

これがXserverや他のレンタルサーバーで使えるかどうかと言うとわかりません。Xserverは`.htaccess`を使用できるようですが、どのディレクティブが使えるかどうかの情報はありませんでした。実際に設定してみて試して見るしか無いと思われます。

* * *

ここまで来て、一つ注意点があります。なぜ、APIキーは環境変数に設定すべきかと言うことです。プログラム全体をGitHubなどのレポジトリで管理している場合、コードの中にAPIキーを入れているとそれもレポジトリに上がってしまいます。それがもしパブリックなレポジトリであったら、APIキーを世界中に公開されてしまうということです。公開されたAPIキーはあっという間に悪用されます。そうなれば、良くてアカウントBAN、サービスによっては数百万円の使用料請求と洒落にならない事態に陥ります。

先程、`.htaccess`を`SetEnv`を使用すればいいと書きました。ちょっと待ってください。その`.htaccess`は誰にも見られるような事になっていないでしょうか？ほとんどのサーバーでは`.htaccess`へのアクセスは制限がかかっていますが、必ずしもそうとは限りません。自分でちゃんとアクセスできないように設定する必要があるかも知れません。もう一つは、`.htaccess`はプログラムと同じ所に置かれるので、先程言ったレポジトリでの管理の場合、一緒に公開してしまう場合があるということです。`.htaccess`にrewrite等の設定を入れている場合、一緒に管理したくなるでしょう。そのような場合で、`.htaccess`の中にAPIキーを埋め込むのはいい方法とは言えません。

何を言いたいかというと、「APIキーは環境変数に入れれば安全」と思考停止しないでください。
**環境変数の設定場所が公開されれば環境変数であっても危険です。**
大事なのは、APIキーが書かれている場所が絶対に公開されないようにすることです。一般に、プロセス自体の環境変数で設定する場合は、ソースツリーとは別の場所になるから、環境変数だと安全な場合が多いと言うだけです。レポジトリの除外対象になっている設定ファイルに書く、DBに保存する等、ソースツリー上には現れない物であれば十分だと言うことです。
CC BY-SA 4.0
2022-09-23T13:22:57.860
91263
2022-09-23T13:22:57.860
7347
91256
answer
コメントにも書きましたが、そもそも環境変数を理解できていないと思われます。まずはWikipediaの[
**環境変数**](https://ja.wikipedia.org/wiki/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0)や[
**プロセス**](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9)を参照し理解することをお勧めします。

> 環境変数はオペレーティングシステム
> が提供するデータ共有機能の一つ。OS上で動作するプロセスがデータを共有するための仕組みである。特にタスクに対して外部からデータを与え、タスクの挙動・設定を変更するために用いる。

> 環境は、親プロセスから子プロセスに複製されて継承される。
> すなわち、子プロセスで環境を変更しない限り、子プロセスの環境は親プロセスのそれと同一の内容である。
> また、子プロセスが自分の環境に対して行った変更は、親プロセスの環境に影響しない。

つまり、 **環境変数はOS・プロセスで標準的に提供される機能** であり、 **レンタルサーバーで利用可否が変わるものではありません** 。

検索しても見つけることができないのは、あまりに基本的過ぎる内容なため、そんなこと知っているわと読み飛ばしてしまっただけでしょう。上で引用したようにWikipedia等で調べればきちんと説明されており、見つけることができたはずです。

* * *

個々のプロセスに対して環境変数の設定方法はさまざまで、プロセスを実行しているプログラムに依存します。  
例えばraccyさんの回答にもありますが、Apache Http
Serverであれば[`SetEnv`ディレクティブ](https://httpd.apache.org/docs/2.4/ja/mod/mod_env.html#setenv)で行えます。またタグ指定されているphpであれば[`putenv`関数](https://www.php.net/manual/ja/function.putenv.php)で行えます。
CC BY-SA 4.0
2022-09-23T23:04:42.070
91267
2022-09-23T23:04:42.070
4236
91256
answer