Biến môi trường http_proxy, https_proxy và no_proxy: cấu hình trên Linux, Windows, Docker
Cập nhật:
Biến môi trường HTTP_PROXY, HTTPS_PROXY và NO_PROXY cho các công cụ dòng lệnh và thư viện lập trình biết phải đi qua proxy nào và bỏ qua proxy cho địa chỉ nào. Cú pháp chuẩn là http://user:pass@ip:port cho cả hai biến proxy, kể cả HTTPS_PROXY, còn NO_PROXY là danh sách tên miền hoặc địa chỉ ngăn cách bằng dấu phẩy. Nên đặt cả bản chữ hoa lẫn chữ thường, vì mỗi công cụ đọc một kiểu. Bài này hướng dẫn đặt tạm thời và cố định trên Linux, Windows, Docker, kèm những trường hợp biến môi trường không có tác dụng và cách kiểm tra.
Ba biến và ý nghĩa
Lỗi phổ biến nhất là viết HTTPS_PROXY=https://.... Scheme trong giá trị mô tả cách kết nối tới chính proxy, không phải tới website. Proxy HTTP/HTTPS thông thường nhận kết nối dạng http://, nên giá trị của cả hai biến đều bắt đầu bằng http://. Proxy của VinaProxy được giao ở dạng ip:port:user:pass; đổi sang URL bằng công cụ chuyển định dạng proxy nếu cần.
| Biến | Giá trị ví dụ | Tác dụng |
|---|---|---|
HTTP_PROXY / http_proxy | http://user:pass@ip:port | Proxy cho request tới địa chỉ http:// |
HTTPS_PROXY / https_proxy | http://user:pass@ip:port | Proxy cho request tới địa chỉ https://; công cụ mở đường hầm CONNECT qua proxy HTTP |
NO_PROXY / no_proxy | localhost,127.0.0.1,.noibo.local | Danh sách địa chỉ đi thẳng, không qua proxy |
Chữ hoa hay chữ thường
Không có chuẩn chung, mỗi công cụ tự quyết. Ví dụ curl chỉ đọc http_proxy chữ thường cho request HTTP (vì lý do bảo mật), nhưng đọc HTTPS_PROXY ở cả hai dạng. Python requests đọc cả hai. Nhiều công cụ khác ưu tiên một dạng và bỏ qua dạng còn lại. Cách an toàn là đặt cả hai dạng với cùng giá trị.
Nếu mật khẩu có ký tự đặc biệt như @, :, # hoặc %, phải mã hoá URL (ví dụ @ thành %40), nếu không công cụ sẽ cắt sai chuỗi và bạn nhận lỗi 407 Proxy Authentication Required.
Linux và macOS
- Tạm thời, chỉ trong cửa sổ terminal hiện tại:
export http_proxy=http://user:pass@ip:portrồiexport https_proxy=$http_proxy,export HTTP_PROXY=$http_proxy,export HTTPS_PROXY=$http_proxy. - Bỏ qua proxy cho địa chỉ nội bộ:
export no_proxy=localhost,127.0.0.1,.noibo.localvàexport NO_PROXY=$no_proxy. - Cố định cho tài khoản của bạn: thêm các dòng
exporttrên vào~/.bashrchoặc~/.zshrc, rồi mở terminal mới. - Cố định cho toàn hệ thống trên Ubuntu: thêm dòng
http_proxy=http://user:pass@ip:port(không có chữexport) vào/etc/environment, đăng xuất rồi đăng nhập lại. Chi tiết ở hướng dẫn cài proxy trên Ubuntu. sudomặc định xoá phần lớn biến môi trường. Dùngsudo -E lenhhoặc cấu hìnhenv_keepnếu lệnh chạy bằng sudo cũng cần proxy.aptkhông đọc biến môi trường khi chạy qua sudo một cách tin cậy; tạo file/etc/apt/apt.conf.d/95proxychứaAcquire::http::Proxy "http://user:pass@ip:port/";và dòng tương tự choAcquire::https::Proxy.- Tắt:
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXYvà xoá các dòng đã thêm vào file cấu hình.
Windows
- CMD, tạm thời cho cửa sổ hiện tại:
set HTTP_PROXY=http://user:pass@ip:portvàset HTTPS_PROXY=http://user:pass@ip:port. - PowerShell, tạm thời:
$env:HTTP_PROXY = 'http://user:pass@ip:port'và$env:HTTPS_PROXY = 'http://user:pass@ip:port'. - Cố định cho người dùng:
setx HTTP_PROXY http://user:pass@ip:portvàsetx HTTPS_PROXY http://user:pass@ip:port. Biến chỉ có hiệu lực ở cửa sổ và ứng dụng mở sau đó. - Có thể sửa qua giao diện: System Properties, Environment Variables, thêm biến ở phần User variables.
- Lưu ý quan trọng: biến môi trường khác với cài đặt proxy hệ thống của Windows. Trình duyệt và nhiều ứng dụng giao diện dùng cài đặt hệ thống, còn curl, git, pip, Python đọc biến môi trường. Cài đặt hệ thống được hướng dẫn ở cài proxy trên Windows.
Docker: ba chỗ khác nhau
Với Docker, proxy có thể cần ở ba nơi, và đặt sai chỗ là lý do phổ biến khiến "đã đặt proxy mà vẫn không chạy".
- Docker daemon kéo image: daemon không đọc biến trong terminal của bạn. Tạo file
/etc/systemd/system/docker.service.d/http-proxy.confvới mục[Service]và dòngEnvironment="HTTP_PROXY=http://user:pass@ip:port" "HTTPS_PROXY=http://user:pass@ip:port" "NO_PROXY=localhost,127.0.0.1", rồi chạysudo systemctl daemon-reloadvàsudo systemctl restart docker. - Container và lúc build: thêm khối
proxiesvào~/.docker/config.jsonvới các khoáhttpProxy,httpsProxy,noProxy; Docker CLI sẽ tự truyền biến vào container mới và vào quá trình build. - Truyền tay cho từng lệnh:
docker run -e HTTPS_PROXY=http://user:pass@ip:port imagehoặcdocker build --build-arg HTTPS_PROXY=http://user:pass@ip:port .. - Trong container,
localhostlà chính container. Nếu proxy chạy trên máy chủ, đừng dùng127.0.0.1trong giá trị proxy. Hướng dẫn đầy đủ ở cài proxy cho Docker.
NO_PROXY viết thế nào cho đúng
- Ngăn cách bằng dấu phẩy, không có khoảng trắng:
localhost,127.0.0.1,.noibo.local,api.congty.vn. - Tên miền bắt đầu bằng dấu chấm như
.noibo.localthường khớp mọi tên miền con; nhiều công cụ cũng hiểunoibo.localtheo cách tương tự. - Hỗ trợ dải địa chỉ dạng CIDR như
10.0.0.0/8khác nhau giữa các công cụ; có công cụ hiểu, có công cụ không. Nếu cần chắc chắn, liệt kê từng địa chỉ hoặc dùng tên miền. - Luôn thêm
localhostvà127.0.0.1để các dịch vụ chạy trên máy không đi vòng qua proxy. - Đưa các dịch vụ nội bộ, kho package riêng, máy chủ cơ sở dữ liệu vào
NO_PROXYđể tránh lỗi kết nối khó hiểu.
Kiểm tra, xử lý lỗi và bảo mật
- Xem biến đang đặt:
env | grep -i proxytrên Linux,Get-ChildItem Env: | Where-Object Name -like '*proxy*'trong PowerShell. - Kiểm tra IP đi ra:
curl -s https://httpbin.org/ipvà so với IP proxy, hoặc mở trang kiểm tra IP của tôi từ máy đó. Thêm-vđể xem curl có thực sự kết nối qua proxy. Xem thêm hướng dẫn dùng proxy với curl. - Không phải chương trình nào cũng đọc biến môi trường. Một số thư viện Node.js hay ứng dụng tự quản lý mạng cần cấu hình proxy riêng, ví dụ cấu hình proxy cho Node.js axios.
- Biến môi trường chứa mật khẩu proxy có thể bị lộ qua lịch sử shell, log hay danh sách tiến trình. Đừng commit file cấu hình chứa mật khẩu lên Git; nếu lỡ lộ, đổi mật khẩu proxy trên dashboard.
- Muốn bỏ proxy hoàn toàn trên máy, xem hướng dẫn tắt proxy.
Câu hỏi thường gặp
HTTPS_PROXY nên bắt đầu bằng http:// hay https://?
Gần như luôn là http://. Scheme mô tả cách kết nối tới proxy, và proxy HTTP/HTTPS thông thường nhận kết nối HTTP rồi mở đường hầm cho trang HTTPS.
Vì sao đã đặt HTTP_PROXY mà curl vẫn không đi qua proxy?
curl chỉ đọc http_proxy chữ thường cho request HTTP. Hãy đặt cả bản chữ thường, hoặc truyền trực tiếp bằng tuỳ chọn -x.
Đặt biến môi trường có làm trình duyệt đi qua proxy không?
Thường là không trên Windows và macOS, vì trình duyệt dùng cài đặt proxy hệ thống. Biến môi trường chủ yếu tác động tới công cụ dòng lệnh và thư viện lập trình.
Docker pull vẫn lỗi dù đã export biến proxy?
Docker daemon chạy như một dịch vụ riêng và không đọc biến trong terminal. Cấu hình proxy cho dịch vụ docker qua systemd rồi khởi động lại.
Proxy có dùng được với ALL_PROXY kiểu SOCKS không?
Proxy của VinaProxy là HTTP/HTTPS với xác thực user và mật khẩu. Hãy dùng HTTP_PROXY và HTTPS_PROXY như trong bài.
Proxy HTTP/HTTPS dùng ngay trên server
IPv4 riêng ở 7 nước và ISP tĩnh ở Việt Nam, Mỹ. Xác thực user và mật khẩu, định dạng ip:port:user:pass, không giới hạn băng thông.
Xem bảng giá