在一些生產場景中,咱們應用服務器沒法直接鏈接外網,不能訪問外網接口、使用yum、wget等相關命令下載依賴。一般須要一臺能夠鏈接外網的服務器做爲代理服務器,提供對外代理功能,使得咱們的內網也能夠訪問外部接口,下載相關依賴,這裏咱們使用的是Squid代理服務器java
Squid是一個高性能的代理緩存服務器,Squid支持FTP、gopher、HTTPS和HTTP協議。和通常的代理緩存軟件不一樣,Squid用一個單獨的、非模塊化的、I/O驅動的進程來處理全部的客戶端請求。想要更多的瞭解的小夥伴,能夠訪問其官網。node
yum install squid -y
yum install httpd-tools -y
複製代碼
htpasswd -cd /etc/squid/passwords 用戶名
#提示輸入密碼
#以後會在/etc/squid目錄下生成一個passwords文件,文件內容(用戶名:密碼密文)
複製代碼
/usr/lib64/squid/basic_ncsa_auth /etc/squid/passwords
#輸入用戶名 密碼
username password
#提示ok說明成功
ok
#ctrl+c退出
複製代碼
# 配置用戶名密碼受權
vi /etc/squid/squid.conf
#在最後添加
auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic realm proxy
acl authenticated proxy_auth REQUIRED
http_access allow authenticated
#這裏是端口號,能夠按需修改
#http_port 3128 這樣寫會同時監聽ipv6和ipv4的端口,推薦適應下面的配置方法。
http_port 0.0.0.0:3128
複製代碼
#啓動start(中止stop)
systemctl start squid.service
#配置開機自啓動
systemctl enable squid.service
複製代碼
proxy=http://username:password@proxy_ip:port/
複製代碼
vi /etc/profile
#在最後加入,分別代理http和https
export http_proxy="http://username:password@proxy_ip:port"
export https_proxy="http://username:password@proxy_ip:port"
複製代碼
由於項目部署在app服務器中,若是項目中調用到了外部接口,能夠對java程序進行代理設置nginx
# 代理http
java -jar -Dhttp.proxyPort=代理服務器端口 -Dhttp.proxyHost=代理服務器IP地址
# 代理https
java -jar -Dhttps.proxyPort=代理服務器端口 -Dhttps.proxyHost=代理服務器IP地址
複製代碼
項目中調用到了https接口,而且具備證書認證,沒法經過Squid代理走過去,筆者研究了好久沒有找到Squid進行證書的方式,若是你有好的想法,能夠在評論區轉載對應博文,一塊兒學習shell
# 使用openssl命令製做通訊證書,下載的證書:xxx.pfx
openssl pkcs12 -in server.pfx -nodes -out server.pem
openssl rsa -in server.pem -out server.key
openssl x509 -in server.pem -out server.crt
複製代碼
將項目中的須要代理的http、https請求改成安裝nginx的代理服務器接口,若是走https請求的話且須要安全證書的話,那麼咱們則在nginx配置相關證書緩存
# 詳見另外一篇nginx博文
# 核心腳本,啓用SSL支持:--with-http_ssl_module
./configure --prefix=/usr/local/nginx --with-http_ssl_module
複製代碼
思想就是java程序訪問proxy服務器,經過nginx配置代理訪問外網接口,如下是代理一個SSL外網接口安全
server {
listen 9443;
server_name localhost;
location / {
# 須要代理的https外部接口
proxy_pass https://ip:port/;
# 該外網接口須要安全證書
proxy_ssl_certificate /app/server.pem;
proxy_ssl_certificate_key /app/server.key;
proxy_ssl_trusted_certificate /app/server.pem;
proxy_ssl_verify off;
proxy_ssl_verify_depth 2;
proxy_ssl_session_reuse on;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
proxy_ssl_ciphers HIGH:!aNULL:!MD5;
}
}
複製代碼