nginx默认不支持https代理

此处使用ngx_http_proxy_connect_module


项目地址http://www.github.com/chobits/ngx_http_proxy_connect_module

编译安装nginx,添加https代理模块

$ wget http://nginx.org/download/nginx-1.15.0.tar.gz
$ tar -xzvf nginx-1.15.0.tar.gz
$ cd nginx-1.15.0/

#git clone 项目后,/path/to/ngx_http_proxy_connect_module/patch/相应版本.patch
$ patch -p1 < /path/to/ngx_http_proxy_connect_module/patch/proxy_connect.patch
$ ./configure --add-module=/path/to/ngx_http_proxy_connect_module

$ make && make install
  • make && make install 需要gcc相关依赖,可根据报错安装

apt-get install gcc

apt-get install libpcre3 libpcre3-dev

apt-get install zlib1g zlib1g-dev

sudo apt-get install openssl

sudo apt-get install libssl-dev
  • mkdir: cannot create directory ‘/usr/local/nginx’: Permission denied

sudo chown your_username /usr/local/nginx
或者
sudo chown -R your_username:your_username /usr/local/
 
在命令中,将 `your_username` 替换为你的用户名。

安装后配置systemctl命令启动

安装后nginx位置为/usr/local/nginx/,启动方式为

cd /usr/local/nginx/sbin
./nginx

这样不太方便,我们希望配置为systemctl命令启动

创建配置文件

源码安装的nginx在/etc/systemd/system/multi-user.target.wants/目录下是没有nginx.service这个文件的,所以要新建

vim /usr/lib/systemd/system/nginx.service

写入内容:

[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid

ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

设置开机启动

systemctl enable nginx.service

重载nginx配置文件

systemctl daemon-reload

重新启动nginx服务

systemctl start nginx

查看nginx服务运行状态

systemctl status nginx

nginx.conf配置

编译源代码安装的nginx的conf路径为

/usr/local/nginx/conf/nginx.conf

在其中添加相应端口监听与转发规则

server {
     listen  8081;
     listen [::]:8081;

     # dns resolver used by forward proxying
     # 添加ipv6=off可有效减少https代理中502错误
     resolver  8.8.8.8 ipv6=off;

     # forward proxy for CONNECT request
     proxy_connect;
     proxy_connect_allow            all;
     proxy_connect_connect_timeout  10s;
     proxy_connect_read_timeout     10s;
     proxy_connect_send_timeout     10s;

     # forward proxy for non-CONNECT request
     location / {
         proxy_pass http://$host;
         proxy_set_header Host $host;
     }
 }

最后系统防火墙放行相应端口即可通过此端口进行代理访问

常见代理访问方式

  • curl 代理

curl https://www.baidu.com -v -x http://ip:port
  • apt 代理

sudo apt-get -o Acquire::http::proxy="http://ip:port" update
  • docker 代理

在执行docker pull时,是由守护进程dockerd来执行。因此,代理需要配在dockerd的环境中。而这个环境,则是受systemd所管控,因此实际是systemd的配置。

sudo mkdir -p /etc/systemd/system/docker.service.d 
sudo touch /etc/systemd/system/docker.service.d/proxy.conf

在这个proxy.conf文件(可以是任意*.conf的形式)中,添加以下内容:

[Service] 
Environment="HTTP_PROXY=http://proxy.example.com:port/" 
Environment="HTTPS_PROXY=http://proxy.example.com:port/" 
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"

查看代理是否设置成功,出现上述信息则成功

sudo dockerinfo

此时docker pull将使用此代理,如在国内可能还需要设置docker镜像源进行加速。