:>/dev/null

ラガードエンジニアの不撓不屈の精神/unlearning/go beyond

mongodb 2.6 クラスタ構成で過負荷対応

クラスタ構成環境のmongosで下記エラー発生。
調査・対応を下記へ記載しておく。

対応方法

1.カーネル設定

vm.swappinessの設定をします。
vm.swappinessは、swap領域の扱いを制御するカーネルの設定です。
この設定値が小さければ小さいほどswapを抑制します。
デフォルトは、vm.swappiness=60です。

参考)Swappiness
vm.swappiness = 0 メモリが一杯になるまでスワップを利用しない
vm.swappiness = 60 規定値
vm.swappiness = 100 全体のパフォーマンスに影響しうるほど積極的にスワップ処理を行う

Swappiness - Wikipedia

設定確認
# sysctl vm.swappiness
vm.swappiness = 60
設定変更
# echo 10 > /proc/sys/vm/swappiness
設定確認
# sysctl vm.swappiness
vm.swappiness = 10
sysctl.confに設定を追記
# vim /etc/sysctl.conf
vm.swappiness = 10

2.logrotate設定

公式ドキュメントによると下記3パターンの設定方法がある。

  • mongo shell

    • mongos> db.runCommand( { logRotate : 1 } )
    • { "ok" : 1 }
  • bash

    • shell> kill -SIGUSR1
    • shell> killall -SIGUSR1 mongod

Rotate Log Files — MongoDB Manual 2.6

bashを使用したローテーションが簡易で良いと考えたが、
実行した場合mongosが落ちるという事象が発生。
原因不明な為、mongo shellを使用したケースで対応。

### cat /root/mongologrotate.sh 
#/bin/sh

# mongod log lotate
mongo --quiet admin /root/MongoLogRotate.js

# clear old olgs
cd {/mongologdir}
DELDAY=`date --date '30 days ago' '+%Y-%m-%d'`

for LINE in `find -iname "mongod.log.$DELDAY*"`
do
  echo "delete $LINE"
  rm -f $LINE
done

### cat /root/MongoLogRotate.js 
db.auth("root", "******")
db.runCommand( { logRotate : 1 } )

### crontab -l
00 15 * * * /bin/sh /root/mongologrotate.sh

3.[slab | page]cache設定

上記2パターンを実行したケースにおいても現象改善されない状況。下記記事からcache設定。

UPDATE: It's fair that the memory usage looks high, which might lead to the conclusion it's another process. There's no other processes using any significant memory on the server; the memory appears to be consumed in the cache, but I'm not clear why that would be the case:

mongodb - Mongod resident memory usage low - Stack Overflow

OS側が保持している各cache設定を開放。

開放前のメモリー使用状況

### free -m
             total       used       free     shared    buffers     cached
Mem:         15951      15204        746          0        145      10355
-/+ buffers/cache:       4703      11248 
Swap:          511        140        371 

### cat /proc/meminfo 
MemTotal:       16334048 kB
MemFree:          764992 kB
Buffers:          149060 kB
Cached:         10604528 kB
SwapCached:         7712 kB
Active:          8825784 kB
Inactive:        5337972 kB
Active(anon):    2757160 kB
Inactive(anon):   653428 kB
Active(file):    6068624 kB
Inactive(file):  4684544 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:        524284 kB
SwapFree:         380280 kB
Dirty:                36 kB

OS保持の各cache開放

# free && sync && echo 3 > /proc/sys/vm/drop_caches && echo "" && free

開放後のメモリー使用状況

### free -m
             total       used       free     shared    buffers     cached
Mem:         15951       4908      11042          0        166       1183
-/+ buffers/cache:       3559      12392 
Swap:          511        124        387 

### cat /proc/meminfo 
MemTotal:       16334048 kB
MemFree:        11306796 kB
Buffers:          170120 kB
Cached:          1212012 kB
SwapCached:         5716 kB
Active:          3907484 kB
Inactive:          99016 kB
Active(anon):    2608944 kB
Inactive(anon):    15848 kB
Active(file):    1298540 kB
Inactive(file):    83168 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:        524284 kB
SwapFree:         396408 kB
Dirty:                40 kB
Writeback:             0 kB
AnonPages:       2618788 kB
Mapped:            14892 kB
Shmem:               424 kB
Slab:             326744 kB
SReclaimable:      84616 kB
SUnreclaim:       242128 kB
KernelStack:      410944 kB
PageTables:        63036 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8691308 kB
Committed_AS:   28622200 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      171952 kB
VmallocChunk:   34359558216 kB
HardwareCorrupted:     0 kB
AnonHugePages:   1978368 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       10240 kB
DirectMap2M:    16766976 kB

cache開放後、free領域がmongoに割り当てされれば問題ない為
mongo shell 起動し、物理メモリ(resident)領域がcache開放前後で増加しているか確認。

mongos> db.serverStatus().mem
{ "bits" : 64, "resident" : 3299, "virtual" : 29016, "supported" : true }

Linuxでページキャッシュを確認・解放してみた - Qiita

Zabbix API を使用してホストリストを取得する

zabbixに多数サーバ登録した場合、ホストリストの視認性に苦労する事がある。
※Webコンパネからポチポチしたくない・・

その場合、APIを使用しリスト化するのが便利そうなので実装した。

<?php


// リクエストデータの作成
$request_ver = array(
    'jsonrpc'   => '2.0',
    'method'    => 'apiinfo.version',
    'id'        => 1,
    'auth'      => null,
    'params'    => array(),
);

$request_token = array(
    'jsonrpc'   => '2.0',
    'method'    => 'user.login',
    'params'    => array(
        'user'      => '[userid]',
        'password'  => '[passwd]',
    ),
    'id'        => 1,
    'auth'      => null,
);

$request_list = array(
    'jsonrpc'   => '2.0',
    'method'    => 'host.get',
    'params'    => array(
        'output' => array('hostid', 'host'),
        'selectGroups'      => array('groupid', 'name'),
        'selectParentTemplates' => array('templateid', 'name'),
        'selectInterfaces'  => array('interfaceid', 'ip'),
    ),
    'id'        => 1,
    'auth'      => '[auth_token]',
);

// リクエストデータを JSON 形式に変換
//$request_json = json_encode($request_ver);     // ver取得
//$request_json = json_encode($request_token);   // auth_token取得 
$request_json = json_encode($request_list);      // ホストリスト取得

// HTTPストリームコンテキストの作成
$opts['http'] = array(
    'method'    => 'POST',
    'header'    => 'Content-Type: application/json-rpc',
    'content'   => $request_json,
);
$context = stream_context_create($opts);

// リクエストの実行
$url = 'http://[basic_auth_id]:[basic_auth_passwd]@localhost/zabbix/api_jsonrpc.php';
$response_json = file_get_contents($url, false, $context);

// レスポンスの表示
$response = json_decode($response_json, true);
//var_dump($response);


//
// ホストリスト取得する場合、下記コード有効化
//

foreach((array)$response as $key => $value){
  foreach((array)$value as $key1 => $value1){
    echo 'hostid:' . $value1['hostid'] . "\t" . 'host:' . $value1['host'] ."\n";
    foreach((array)$value1 as $key2 => $value2){
      if ($key2 == 'groups'){
        echo $key2 . "\n";
        foreach((array)$value2 as $key3 => $value3){
          echo 'groupid:' . $value3['groupid'] . "\t" . 'groupname:' . $value3['name'] ."\n";
        }
      }
      if ($key2 == 'parentTemplates'){
        echo $key2 . "\n";
        foreach((array)$value2 as $key4 => $value4){
          echo 'templateid:' . $value4['templateid'] . "\t" . 'templatename:' . $value4['name'] ."\n";
        }
      }
      if ($key2 == 'interfaces'){
        echo $key2 . "\n";
        foreach((array)$value2 as $key5 => $value5){
          echo 'interfaceid:' . $value5['interfaceid'] . "\t" . 'ip:' . $value5['ip'] ."\n";
        }
      }
    }
  }
}

上記実行時した場合の出力結果を示します。

hostid:1234    host:vm1234
groups
groupid:11      groupname:DB servers
groupid:19      groupname:groupA
groupid:15      groupname:Staging servers
parentTemplates
templateid:10860        templatename:Template OS CentOS7
templateid:11303        templatename:Template App MySQL GroupReplication
interfaces
interfaceid:1183        ip:172.31.100.1

出力フォーマットの検討の余地があるが、箇条書きベースでリスト取得出来た。

PHP-FPMに環境変数を渡す

centos+nginx+php-fpmで構築したサーバで外部プロキシ経由のインターネット接続設定時でのメモ。
apache+phpで構築したサーバでは「/etc/environment」を起動時に読み込み可能な為、環境変数設定が可能だが上記環境では正常に読み込まれない。
調査・対応を下記へ記載しておく。

  • 以下構築要件
    • apache+php ← 「/etc/environment」読み込まれる (env設定可能)
    • centos+nginx+php-fpm ←「/etc/environment」読み込まれない(env設定不可)
■ 改修前
$ vim www_root/index.php

$context = stream_context_create(['http' => ['timeout' => 3]]);
$content = file_get_contents('http://[DST_SRV]', false, $context);
↓
■ 改修後
nginx?php-fpm?側で/etc/environmentの設定が読み込まれない為、下記設定したが環境変数が反映されない。。
※nginx、php-fpmの各ホームディレクトリで~/.bash_profileを設置したが、こちらも反映されず。。

$ /etc/php-fpm.d/www.conf
clear_env = noの行のコメントアウトをはずして再読み込みすると解消する。
@@ -367,7 +367,7 @@
 ; Setting to "no" will make all environment variables available to PHP code
 ; via getenv(), $_ENV and $_SERVER.
 ; Default Value: yes
-;clear_env = no
+clear_env = no


上記設定で環境変数が反映されない為、confへ直接記載する。
$vim /etc/php-fpm.d/www.conf
env[HTTP_PROXY] = gwproxy.mysrv.com:3128


$ vim www_root/index.php
$proxy_context = array(
      "http" => array(
         "proxy" => "tcp://".$_SERVER['HTTP_PROXY'],
         'request_fulluri' => true,
         'timeout' => 3,
      ),
);
$context = stream_context_create($proxy_context);
$content = file_get_contents('http://[DST_SRV]', false, $context);

上記設定で外部プロキシ経由したインターネット接続が可能になります。
apache+php環境同様にアプリ側でproxyを意識せず、透過的に設定可能なら良いのですが。
curl_init関数使用した環境では、「/etc/environment」環境辺変数指定でproxy経由接続可能。file_get_contents関数を使用した場合で発生する事象と判明。関数仕様に依存した現象。
clear_env = noの行のコメントアウトをはずして再読み込みすると解消する。

$vim /etc/php-fpm.d/www.conf
clear_env = no

red)

PHP-FPMに環境変数を渡す - Qiita

Centos7でFirewalldを用いたポートフォワード設定

CentOS 7で採用されたFirewallでのポートフォワード設定を構築したのでメモしておく。
firewall-cmd –directよりfirewall-cmd –add-rich-ruleの方が個人的には分かりやすく感じたのでこちらで。

  • 以下構築要件
    • 内部ネットワークは全許可
    • 80番ポートにアクセスしてきたらsquidの3128番ポートへポートフォワード
firewall-cmd --add-masquerade
firewall-cmd --add-rich-rule="rule family="ipv4" source address="10.0.0.0/8" accept"
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" forward-port port="80" protocol="tcp" to-port="3128"'
※firewall-cmd --directの場合、[firewall-cmd --direct --add-forward-port=port=80:proto=tcp:toport=3128]

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160 ens192
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: yes
  forward-ports: 
  sourceports: 
  icmp-blocks: 
  rich rules: 
        rule family="ipv4" source address="10.0.0.0/8" accept
        rule family="ipv4" source address="10.0.0.0/8" forward-port port="80" protocol="tcp" to-port="3128"

これは”–permanent“が無いので一時的な設定になります。
firewall-cmd –reloadを実行すれば解除できます。
ルールを削除する場合、sed -i -e "s/--add-forward-port --remove-forward-port/"

参考

透過型proxyの構築まで~その2~ - いつまでも高みを目指して

Firewalldで特定のポートに特定のネットワークから許可 ← RootLinks Co., Ltd.

Centos系でのMASQUERADE構築

Centos7

●マスカレードホストルータ

  • firewallコマンドにてMASQUERADE設定
# firewall-cmd --direct --get-all-rules
firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.0.0.0/8 -j MASQUERADE
firewall-cmd --direct --add-rule ipv4 filter POSTROUTING 0 -t nat -s [src_server_gip] -j MASQUERADE
firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -o ens160 -j ACCEPT
firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i ens192 -m state --state RELATED,ESTABLISHED -j ACCEPT

※ens160:GIP,ens192:LIP
※ルール削除する場合、sed -i -e "s/--add-rule --remove-rule/"

# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
  • 設定確認
# sysctl -p
net.ipv4.ip_forward=1

●適用&確認

# systemctl unmask firewalld
# systemctl enable firewalld
# systemctl start firewalld
# systemctl status firewalld

●一時的設定と恒久的設定について

設定のコマンドを説明する前に一時的設定と恒久的設定について説明していきます。

一時的設定(–permanentオプション無し)

「firewall-cmd」コマンドで設定を行う際に、「–permanent」オプションを指定しなければその設定は一時的な設定となり、サーバや>「firewalld」のサービスを再起動すると設定が消えてしまいます。

恒久的設定(–permanentオプションあり)

サーバの再起動や「firewalld」サービスの再起動で設定が消えてしまわないようにするためには、「–permanent」オプションを使用して設> 定を行う必要があります。

その際、「–permanent」オプションを指定して設定を行った場合は、そのままでは「firewalld」に設定が反映されないため「fiewall-cmd –reload」で設定を反映させる必要があります。

●子クライアント

# route add default gw [MASQUERADE_server_ip]
※削除する場合 route del default gw [MASQUERADE_server_ip]
  • ルーティングの永続化
    • /etc/sysconfig/network-scripts/route-[インタフェース名]
    • これに下記のようなルーティング情報を記載
# cat /etc/sysconfig/network-scripts/route-eth0
[dst_server_gip]/32 via [MASQUERADE_server_ip] eth0
  • 特定Dstの場合、ルーティング追加にて個別設定可能
# route add -net [dst_server_gip] netmask 255.255.255.255 gw [MASQUERADE_server_ip] eth0
  • 確認
# ip route show

Centos6

●マスカレードホストルータ

  • iptablesコマンドにてMASQUERADE設定
# iptables -t nat -I PREROUTING -i eth0 -s 172.31.0.0/16 -p tcp --dport 80 -j DNAT --to-destination [MASQUERADE_server_ip:port]

※上記で正常に動作しない場合、下記書き方も検討

# iptables -t nat -A PREROUTING -i eth0 -s ! [src_server_ip] -p tcp --dport 80 -j DNAT --to [MASQUERADE_server_ip:port]
# iptables -t nat -A POSTROUTING -o eth0 -s 172.31.0.0/16 -d [MASQUERADE_server_ip] -j SNAT --to [src_server_ip]
# iptables -A FORWARD -s 172.31.0.0/16 -d [MASQUERADE_server_ip] -i eth0 -o eth0 -p tcp --dport [MASQUERADE_server_port] -j ACCEPT

参考

firewalldの設定方法(基本設定編) | server-memo.net

squidによる多段プロキシ

多段でプロキシを組む場合、つまずいたのでメモがてら残しておく。

以下の様なパターンでアクセスが発生する。

  • PC => WWW
  • PC => PROXY (外部Proxy)(認証有) => WWW
  • PC => PROXY (イントラGW) => PROXY(外部Proxy)(認証有) => WWW

今回の目的

  • 外部Proxyサーバを経由して、アクセスさせる事により外部連携時のIP申請を省略する。
  • イントラGWを経由する事により、外部Proxyサーバの認証情報を一括管理する。
    • 各PCで外部Proxyサーバの認証情報を保持したくない。⇒セキュリティーポリシー・メンテナンス低下
  • 上記構成を実現する為、下記ネットワークを組む。
    • 各PC(ルーティング設定) ⇒ イントラGW ⇒ 外部Proxy ⇒ 外部接続

設定関連

各クライアントPC

  • OSのシステムファイルへイントラGWを指定
$ cat /etc/environment
# プロキシ設定 ==============================================
# 実際の環境変数の設定
export http_proxy="http://gwproxy.mysrv.com:3128"
export https_proxy="http://gwproxy.mysrv.com:3128"
# プロキシを利用しないアドレスの指定(必須)
export no_proxy="127.0.0.1,localhost"
export NO_PROXY="$no_proxy"

イントラGW

$ sudo vim /etc/squid/squid.conf
acl localnet src 192.168.0.0/16
http_access allow localnet
cache_peer proxy.srv.com parent 3128 0 proxy-only login=ID:PASS
never_direct allow all
never_direct allow CONNECT
visible_hostname unknown
forwarded_for off
  • cache_peer [上位プロキシの IP アドレス] parent [上位プロキシの ポート番号] [icp ポート番号] no-query [login=id:PASS]
  • proxy-only…ピアから取ってきたオブジェクトは、ローカルに保存しない
  • never_direct allow all…全てのリクエストを上位プロキシに転送する
  • never_direct allow CONNECT…社外ネットワークに接続する場合のSSL接続は、上位Proxyへパス(SSLはデフォルトで直接接続しようとする)
  • visible_hostname unknown…ホスト名の非表示
    • 「HTTP_VIA」というプロキシサーバーのホスト名を表示する環境変数を表示させない。 squid.conf では、「visible_hostname」というセクションがこれに対応しており、ここには通常は自分のホスト名を記述するのですが、「unknown」としてあたかも判別できなかったかのようにします。
  • forwarded_for off…一応IP隠す。

挙動確認

  • 各クライアントPCから下記コマンド発行
$ curl -v -H 'Cache-Control: no-cache' -L 'http://google.com/'

// 443の場合
$ git clone https://[user]@stash.test.com/src/test.git mydir

ホワイトリスト・除外リスト

never_direct

インターネット接続、つまりここまでに定義されていないドメインへのアクセスは、最終的に暗黙の転送先へ転送されます。
プロキシを使用する範囲、つまり「Exampleドメイン以外」の直接取得を禁止します。
never_direct allow yahoo
never_direct allow !example

always_direct

Exampleドメインだけは明示的に直接取得を許可します。さもないとプロキシーへ投げます。
always_direct allow example

サンプル
acl all src 0.0.0.0/0.0.0.0
acl host1 src [GIP:xxx.xxx.xxx.xxx]/255.255.255.255
acl yahoo dstdomain .yahoo.ne.jp .yimg.jp
acl google dstdomain .google.com .google.co.jp
acl mydomain dstdomain .mydomain.com .mydomain.co.jp


#always_direct allow host1
#always_direct allow yahoo
#always_direct allow google
always_direct allow !mydomain ←mydomainは親プロキシを経由。通常特定URL許可指定するが、今回は特定URLのみ親プロキシを経由する為
#always_direct allow all ←上記マッチしなかったもの、つまり「上記リストではないもの」は親プロキシを経由せず直接アクセス許可
# cat access.log
1495610456.780    126 10.131.0.206 TCP_MISS/200 103173 GET http://www.mydomain.com/ - FIRSTUP_PARENT/[親プロキシIP] text/html←親プロキシ経由
1495610490.536    204 10.131.0.206 TCP_MISS/200 46298 GET http://www.google.co.jp/? - HIER_DIRECT/[DST_IP] text/html←直接アクセス
// 443の場合
1497595884.998   2082 127.0.0.1 TCP_TUNNEL/200 4728 CONNECT stash.test.com:443 - FIRSTUP_PARENT/[親プロキシIP] -

ref)
Squid→Squidへ の多段プロキシ - それマグで!
cache_peer

HTTP proxy越しにSSHする

イントラGW

$ sudo vim /etc/squid/squid.conf

# ssh proxy
acl SSH_ports port 2222
acl Safe_ports port 2222        # ssh
http_access allow CONNECT SSH_ports

各クライアントPC

  • sshのconfig設定を使用してssh設定を行う
$ cat .ssh/config 
Host stash.test.com
        User user
        HostName stash.test.com
        Port 2222
        IdentityFile ~/.ssh/test.key
        ProxyCommand connect -H gwproxy.mysrv.com:3128 %h %p

$ chmod 600 .ssh/config
$ vim .ssh/test.key
-- 鍵内容をコピー ---
$ chmod 600 .ssh/test.key

// connectコマンドが「/bin/bash: line 0: exec: connect: not found」の場合
$ rpm -ivh http://mirror.fairway.ne.jp/dag/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
$ rpm -ivh http://mirror.fairway.ne.jp/dag/redhat/el7/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
$ yum install --enablerepo=rpmforge connect

// sshプロトコルよりソース取得
$ git clone ssh://git@stash.test.com:2222/test/test.git mydir
# cat access.log
1497509393.078      1 127.0.0.1 TCP_TUNNEL/502 0 CONNECT stash.test.com:2222 - FIRSTUP_PARENT/[親プロキシIP] - ←親プロキシ経由(親プロキシ側で拒否されている)
1498460374.471   7051 10.131.0.217 TCP_TUNNEL/200 1700614 CONNECT stash.test.com:2222 - FIRSTUP_PARENT/[親プロキシIP] - ←親プロキシ経由(正常接続)

CentOSCVSを使用する場合

proxy経由でcvsを使用する場合、cvs 1.12.7以降で対応されいる様だが
CentOS6の標準repoでは現時点(20170712)でv1.11.xしか提供されてない為、src⇒buildの必要有り。
※CentOS7系では対象ソース無し

$yum install rpm-build.x86_64 libtool zlib-devel krb5-devel pam-devel
$mkdir -p /usr/src/redhat/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
$wget -P /usr/src/redhat/SRPMS http://ftp.tmapy.cz/tmapy-twist/centos/6Server/obsolete/SRPMS/cvs-1.12.13-2.el6.1.src.rpm
$rpmbuild --rebuild /usr/src/redhat/SRPMS/cvs-1.12.13-2.el6.1.src.rpm
$rpm -ivh /root/rpmbuild/RPMS/x86_64/cvs-1.12.13-2.el6.1.x86_64.rpm
  • 挙動確認
cvs -d ":pserver;proxy=gwproxy.mysrv.com;proxyport=3128:[user]@[cvs_server]:[port]/usr/home/cvsroot" login

ref)
Ubuntu日本語フォーラム / [質問] cvs pserver proxy経由でのアクセスについて

  • エラー対応
    sshdで「refused connect from ...」で繋がらない

    • 原因
      TCP Wrapperの可能性。
----hosts.allowの内容----
ALL: 192.168.0.0/255.255.0.0
ALL: 127.0.0.1
  • 対策 hosts.allowに設定追加。
sshd: ALL

PHPのcRUL関数を用いたProxy接続

PHPでの開発時、Proxy経由で外部連携等々でcRUL接続を行う場合のサンプルコードを以下に示す。

<?php

$ch = curl_init();
$fp = fopen("/tmp/test.txt", "w");

// 通信内容を保存するためのテンポラリファイル
$errfp = tmpfile();

$loginpassw = 'ID:PASS';
$proxy_ip = 'http://proxy.test.com';
$proxy_port = '3128';
$url = 'http://www.google.com';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// proxy接続を無効にする場合、以下ブロックをコメント
curl_setopt($ch, CURLOPT_PROXYPORT, $proxy_port);
curl_setopt($ch, CURLOPT_PROXYTYPE, 'HTTP');
curl_setopt($ch, CURLOPT_PROXY, $proxy_ip);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $loginpassw);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_STDERR, $errfp);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);



// file output
//curl_setopt($ch, CURLOPT_FILE, $fp);

$ret = curl_exec($ch);
print_r($ret);


// 記録した通信内容を読み出す
fseek($errfp, 0);
while (($line = fgets($errfp)) !== FALSE) {
    $tmp .= $line . "<br />";
}
// 通信状況を出力
echo $tmp;

curl_close($ch);
fclose($fp);
?>

参考

https://ameblo.jp/itboy/entry-11983530735.html

■wwwサーバのProfileとして読み込ませる事も可能

wwwサーバをapacheユーザーとして起動しいる場合
proxy-user = "ID:PASS"
proxy = "http://proxy.test.com:3128"

■システム全体へ適用

OS構成ファイル/etc/environmentへ配置

  • environmentファイル作成
    • $ vim /etc/environment
# プロキシ設定 ==============================================
# 実際の環境変数の設定
export http_proxy="http://ID:PASS@proxy.test.com:3128"
export https_proxy="http://ID:PASS@proxy.test.com:3128"
# 大文字バージョンしか認識しないプログラム用
export HTTP_PROXY="http://ID:PASS@proxy.test.com:3128"
export HTTPS_PROXY="http://ID:PASS@proxy.test.com:3128"
# プロキシを利用しないアドレスの指定(必須)
export no_proxy="127.0.0.1,localhost"
export NO_PROXY="$no_proxy"

上記により全てのユーザーで共通して使用可能。

■蛇足

curl の基本設定ファイルを作ることが出来る
~/.curlrc

Default config file, see -K, --config for details.

.curlrc に書く書き方は -K で指定する config ファイルと同じ

  • ①configファイル作成
    • $ vim /etc/curlrc
      • [/var/www/.curlrc]参照
  • ②configファイル指定した挙動確認
ここら辺を良しなに作成する一括設定スクリプト

下記サイト参照

http://www.magtranetwork.com/aws/batch_proxy_settings.html