【永久保存版】もう迷わない！ツールごとの Web プロキシ設定

プロキシ設定はつらい。

環境変数か、設定ファイルか、コマンドラインの引数指定か、それ以外か。
一般にコマンドライン引数、設定ファイル、環境変数の順に設定が有効だが、本当か。
環境変数は大文字・小文字どちらなのか。
...など、ツールごとに違うし、公式のドキュメントにたどり着きにくいし、つらい。

昨今、 HTTP プロキシが必須なことはまれで、だいたい HTTPS プロキシを設定すれば十分そう。

ツールごとの HTTPS プロキシ設定をまとめておく。

## プロキシ設定

### Linux OSパッケージ管理

#### apt

環境変数か、設定ファイルで設定を書く。

設定ファイルの場合、 `/etc/apt/apt.conf.d/proxy.conf` に設定を加える。

```text
Acquire::https::Proxy "http://proxy.example.com:3128";
```

- 参考資料
    - apt.conf(5)
        - https://linux.die.net/man/5/apt.conf#:~:text=The%20%22http_proxy%22%20environment%20variable%20will%20override%20all%20settings.
            - > The "http_proxy" environment variable will override all settings.
    - apt/methods / http.cc
        - https://github.com/Debian/apt/blob/92dfc56a541894e293019920fe9031ae4d42fb29/methods/http.cc#L450-L469
            - 設定ファイルの記載なければ環境変数を読む。

#### dnf

環境変数か、設定ファイルで設定を書く。

設定ファイルの場合、 `/etc/dnf/dnf.conf` に設定を加える。

```text
proxy http://proxy.example.com:3128
```

- 参考資料
    - dnf.conf(5)
        - https://man7.org/linux/man-pages/man5/dnf.conf.5.html#:~:text=Empty%20by%20default.-,proxy,-string%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20URL%20of
            - > URL of a proxy server to connect through. Set to an empty string in the repository configuration to disable proxy setting inherited from the main section. The expected format of this option is <scheme>://<ip-or-hostname>[:port].

#### yum

dnf と同様そうなので省略。

#### apk

環境変数 https_proxy を設定する。

- 参考資料
    - Document proxy support better
        - https://gitlab.alpinelinux.org/alpine/apk-tools/-/issues/10756#note_171636
            - > Well, then just use the http proxy variables, http_proxy, https_proxy, and no_proxy all work.

### Microsoft Windows

TODO: netsh.exe でプロキシを設定する。

```console
PS > Get-ComputerInfo | select WindowsProductName, OsVersion

WindowsProductName OsVersion
------------------ ---------
Windows 10 Home    10.0.22631
```

```console
PS > netsh winhttp set proxy /?

使用法:  set proxy [proxy-server=]<サーバー名> [bypass-list=]<ホスト一覧>

パラメーター:

  タグ             値
  proxy-server  -  http または https プロトコルに使用するプロキシ サーバー
  bypass-list   -  プロキシをバイパスすることで表示するサイトの
                   一覧 (短い名前のホストをすべてバイパスする場合は
                   "<local>" を使用)

例:

  set proxy myproxy
  set proxy myproxy:80 "<local>;bar"
  set proxy proxy-server="http=myproxy;https=sproxy:88" bypass-list="*.foo.com"
```

- 参考資料
    - ProxyCfg.exe proxy configuration tool
        - https://learn.microsoft.com/en-us/windows/win32/winhttp/proxycfg-exe--a-proxy-configuration-tool
            - > ProxyCfg.exe has been deprecated since Windows Vista and Windows Server 2008. It's replaced by Netsh.exe (see Netsh.exe commands).
    - Netsh.exe commands
        - https://learn.microsoft.com/en-us/windows/win32/winhttp/netsh-exe-commands

### コマンドライン・ツール

#### curl

引数で指定するか、環境変数を設定する。

環境変数の場合、次のように定義する。

```bash
export https_proxy="http://proxy.example.com:3128"
```

環境変数の名前は大文字 `HTTPS_PROXY` も有効だが、小文字 `https_proxy` が良い。

- 参考資料
    - `-x/--proxy <proxyhost[:port]>`
        - https://curl.se/docs/manpage.html#-x
    - Environment
        - https://curl.se/docs/manpage.html#ENVIRONMENT
            - > The environment variables can be specified in lower case or upper case. The lower case version has precedence. "http_proxy" is an exception as it is only available in lower case.

#### wget

環境変数か、設定ファイルで設定を書く。

設定ファイルの場合、 `$HOME/.wgetrc` に設定を加える。

```text
https_proxy = http://proxy.example.com:3128/
```

- 参考資料
    - Sample Wgetrc
        - https://www.gnu.org/software/wget/manual/html_node/Sample-Wgetrc.html

#### git

`git config` 設定か、環境変数を設定する。

環境変数の場合、 curl 同様に設定する。
次のように定義する。

```text
export https_proxy="http://proxy.example.com:3128"
```

- 参考資料
    - `http.proxy`
        - https://www.git-scm.com/docs/git-config/#Documentation/git-config.txt-httpproxy
            - > Override the HTTP proxy, normally configured using the http_proxy, https_proxy, and all_proxy environment variables (see curl(1))

### Docker

#### dockerd デーモン

設定ファイル `daemon.json` (ただし Docker Engine 23.0 以降)か、環境変数で設定する。

環境変数で設定する場合、 systemd で管理される Linux なら `systemctl edit docker.service` で設定する。

```bash
systemctl edit docker.service
```

```text
[Service]
Environment="HTTPS_PROXY=http://proxy.example.com:3128"
```

環境変数の名前は大文字や小文字を問わない。

- 参考資料
    - Configure the Docker daemon to use a proxy server
        - https://docs.docker.com/config/daemon/systemd/#httphttps-proxy
    - docker.service - How to edit systemd service file?
        - https://unix.stackexchange.com/questions/542343/docker-service-how-to-edit-systemd-service-file
            - `systemctl edit docker.service`

#### Docker クライアント, docker コマンド

TODO

- 参考資料
    - https://docs.docker.com/network/proxy/

### Node.js

#### npm

`npm config` 設定か、環境変数で設定する。

設定の場合、次のように設定する。

```bash
npm config set https-proxy "http://proxy.example.com:3128"

# または

npm -g config set https-proxy "http://proxy.example.com:3128"
```

環境変数の場合、 curl 同様に設定する。
次のように定義する。

```text
export https_proxy="http://proxy.example.com:3128"
```

- 参考資料
    - npm-config
        - https://docs.npmjs.com/cli/v10/commands/npm-config
    - https-proxy
        - https://docs.npmjs.com/cli/v10/using-npm/config#https-proxy
            - > A proxy to use for outgoing https requests. If the HTTPS_PROXY or https_proxy or HTTP_PROXY or http_proxy environment variables are set, proxy settings will be honored by the underlying make-fetch-happen library.
    - make-fetch-happen / README.md
        - https://github.com/npm/make-fetch-happen/blob/ed73ef528397a574df711e24238aaf7954512e55/README.md?plain=1#L239-L240
            - > Additionally, `process.env.HTTP_PROXY`, `process.env.HTTPS_PROXY`, and `process.env.PROXY` are used if present and no `opts.proxy` value is provided.

### Python3

#### pip コマンド

引数で指定するか、設定ファイルか、環境変数などで設定する。

環境変数の場合、次のように定義する。

```bash
export https_proxy="http://proxy.example.com:3128"
```

環境変数の名前は小文字が有効である。大文字が有効かわからない。

- 参考資料
    - Using a Proxy Server
        - https://pip.pypa.io/en/stable/user_guide/#using-a-proxy-server
            - > pip can be configured to connect through a proxy server in various ways

#### urllib3 パッケージ

少なくともコードや、環境変数で設定できる。

```bash
export HTTPS_PROXY="http://proxy.example.com:3128"
```

環境変数の名前は大文字が有効である。小文字が有効かわからない。

- 参考資料
    - Your proxy appears to only use HTTP and not HTTPS
        - https://urllib3.readthedocs.io/en/stable/advanced-usage.html#your-proxy-appears-to-only-use-http-and-not-https

#### requests パッケージ

少なくともコードや、環境変数で設定できる。

```bash
export https_proxy="http://proxy.example.com:3128"
```

環境変数の名前は大文字や小文字を問わない。

- 参考資料
    - Proxies
        - https://requests.readthedocs.io/en/latest/user/advanced/#proxies
            - > When the proxies configuration is not overridden per request as shown above, Requests relies on the proxy configuration defined by standard environment variables http_proxy, https_proxy, no_proxy, and all_proxy. Uppercase variants of these variables are also supported.

## 主な変更履歴
 
- 2024-03-20: Microsoft Windows を加えた。

## TODO

- .curlrc
- TODO

## さいごに

加筆したいものがあればコメントにどうぞ！