バージョン取得コマンド まとめ


[root@??? ???]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov  5 2018 01:47:09


[root@??? ????]# java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

[root@??? ???]# php -v
PHP 7.1.25 (cli) (built: Dec  8 2018 13:52:58) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.1.25, Copyright (c) 1999-2018, by Zend Technologies

[root@??? ????]# python --version
Python 2.7.5

[root@??? ???]# perl -v | head -n 3

This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi
(with 38 registered patches, see perl -V for more detail)

[root@??? ???]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core) 

[root@???? ????]# mysql -uroot -p???????????_ --version
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql  Ver 8.0.13 for Linux on x86_64 (MySQL Community Server - GPL)

[root@???? ????]# postfix -v
postfix: name_mask: ipv4
postfix: inet_addr_local: configured 4 IPv4 addresses
postfix/postfix-script: error: unknown command: ''
postfix/postfix-script: fatal: usage: postfix start (or stop, reload, abort, flush, check, status, set-permissions, upgrade-configuration)

[root@??? ???]# vsftpd -v
vsftpd: version 3.0.2

[root@??? ???]# wget --version | head -n 1
GNU Wget 1.14 built on linux-gnu.

[root@??? ???]# curl --version
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.36 zlib/1.2.7 libidn/1.28 libssh2/1.4.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp 
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz unix-sockets 

[root@???? bin]# ./version.sh
/usr/local/tomcat9/bin/setenv.sh: 行 3: /root: ディレクトリです
Using CATALINA_BASE:   /usr/local/????
Using CATALINA_HOME:   /usr/local/????
Using CATALINA_TMPDIR: /usr/local/????/temp
Using JRE_HOME:        /
Using CLASSPATH:       /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar
Server version: Apache Tomcat/9.0.10
Server built:   Jun 20 2018 17:32:21 UTC
Server number:  9.0.10.0
OS Name:        Linux
OS Version:     3.10.0-957.1.3.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_191-b12
JVM Vendor:     Oracle Corporation

root@??????:/?????# cat /etc/debian_version
7.11

Apache2.4 <=> Tomcat 連携

/etc/httpd/conf.d/ の中にインクルードする設定ファイルを作り、以下のような記述を入れます。
8009 はデフォルトのTomcatの server.xml に設定されたポート番号なので、変えた場合、変える必要あります。

<Location /tomcat_sitename>
  ProxyPass ajp://127.0.0.1:8009/tomcat_sitename
</Location>

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Tomcatハンドブック
価格:5170円(税込、送料無料) (2023/1/11時点)

Apache2.4 プロキシ配下でリアルなリモートIPを取得する設定

httpd.conf に以下のような設定を入れます。


LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader X-Forwarded-For

RemoteIPInternalProxy 10.0.0.0/8
RemoteIPInternalProxy 192.0.0.0/8
RemoteIPInternalProxy ???.???.???.0/24

Apache2.4 ログローテーションの設定

httpd.conf に以下のような記述を入れてます。
プロキシされてるサーバーなので、SSLの設定入れてませんが、必要な場合、ssl.confに同様の設定入れるとよいです。

<IfModule log_config_module>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    ### last %D means micro second ###
    LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined
    LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    #
    # The location and format of the access logfile (Common Logfile Format).
    # If you do not define any access logfiles within a <VirtualHost>
    # container, they will be logged here.  Contrariwise, if you *do*
    # define per-<VirtualHost> access logfiles, transactions will be
    # logged therein and *not* in this file.
    #
    #CustomLog "logs/access_log" common

    #
    # If you prefer a logfile with access, agent, and referer information
    # (Combined Logfile Format) you can use the following directive.
    #
    SetEnvIf User-Agent "ELB-HealthChecker.*" nolog
    #CustomLog "logs/access_log" combined env=!nolog
    CustomLog "|/usr/sbin/rotatelogs /home/Log/apache/access_log_%Y%m%d 86400 540" combined env=!nolog
</IfModule>

jq でJSON を整形

本家 Tutorial : https://stedolan.github.io/jq/tutorial/

わかりやすい紹介 : https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af

inotify-tools の分かり易い説明 : https://qiita.com/stc1988/items/464410382f8425681c20

アプリケーションのログがJSONテキストで、フィールドを分けて、データベースのテーブルに追加できるスクリプトを作りました。
MySQL 5.7 から、JSON型が提供されたので、整形しないでそのまま追加すれば使えますが、抽出のSQLに慣れてなく、列で分けた方が視認性良いのでそうしてます。

[ 大まかな流れ ]

1) ログは逐次出力されるので、inotify で更新を待ち受け
2) ログの行が追加された時点で、発火
3) 最終行を取得して、sedとかgawkで変換
4) jqで各列値を取得
5) SQL文に整形して、INSERTコマンドを渡しテーブルに追加

[ コード例 ]


#!/bin/bash

### NextCloud log add to my table log ###

# $1 : SiteName (end part of URI) 
# required package: inotify-tools

## --------- const ------------- ##

FIELD_ARRAY=(reqId level time remoteAddr user app method url message userAgent version,)
INSSQL="INSERT INTO log_use (NM_SITE,"

INTERVAL_COMMIT=10         # 一括した時スキップするので
# in order to avoid 
# should write notify result to file. and check row count by wc. and write SQL script file

## ----------------------------- ##

nmsite=$1

watch_file=/home/ncdata/${nmsite}/nextcloud.log
#events=(-e CREATE -e MODIFY -e MOVED_TO)

cnt=0
argsql=""
cmdpost="";
while inotifywait -e MODIFY ${watch_file}; do
  row=`tail -n 1 ${watch_file}`
  echo ${row}
  echo "------------------------------------------------------------"

  # execute jq #
  #echo ${row} | jq
  
  #echo "-- method"
  #echo ${row} | jq -r '.method'
  let cnt++
  echo ${cnt}

  echo "-- SQL"
  cursql=${INSSQL}
  # Field part # 
  for fld in ${FIELD_ARRAY[@]}; do
    cursql=${cursql}${fld}","
  done
  cursql=${cursql}") VALUES ("
  cursql=`echo ${cursql} | sed 's/,,//g'`

  # Value part #
  cursql=${cursql}"'"${nmsite}"',"
  for fld in ${FIELD_ARRAY[@]}; do
    nmfld=`echo ${fld} | sed 's/,//'`
    curval=`echo ${row} | jq ."${nmfld}"`

    if [ ${nmfld} = "time" ]; then
      curval=`echo ${curval} | sed 's/\+[0-9][0-9]:[0-9][0-9]//'`
    fi

    cursql=${cursql}${curval}","
  done
  cursql=${cursql}");"
  cursql=`echo ${cursql} | sed 's/,);/);\n/g'`
  #cursql=`echo -e $cursql"\n"`
  #echo ${cursql}


  argsql=${argsql}${cursql}

  # Execute command #
  if [ ${cnt} -eq ${INTERVAL_COMMIT} ]; then
    #cmdpost=${CMD_SQL}${argsql}"'"
    echo ${argsql} > ${INSSQL_FILENAME}

    ## debug
    tmcur=`date "+%Y%m%d-%H%M%S"`
    #cp ${INSSQL_FILENAME} ${INSSQL_FILENAME}"."${tmcur}

    echo `ls -l ${INSSQL_FILENAME}`
    cmdpost=${CMD_SQL}${INSSQL_FILENAME}
    echo "-- MySQL shell command"
    #echo ${cmdpost}
    #`${cmdpost}`      ???????????? script incorrect

    # Write MySQL database #
    mysql -u???? -p????????? mytable < ${INSSQL_FILENAME}

    argsql=""
    echo "" > ${INSSQL_FILENAME}
    cnt=0
  fi


done

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

新しいLinuxの教科書 [ 三宅英明 ]
価格:2970円(税込、送料無料) (2023/1/20時点)

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

UNIXという考え方—その設計思想と哲学
価格:2485円(税込、送料無料) (2023/1/29時点)

CentOS7系 6系より便利なところ

基本的に設定ファイルをいじる方式から、コマンドで設定を変更する方式に変わってきてる。

1)  systemd で起動、終了、自動起動、ステータスがわかりやすい。自作サービスも作りやすい

2) firewalld でファイアウォールの設定がやりやすい

3) nmtui, nmcui のネットワーク設定が便利

詳しくはこちらのリク: https://qiita.com/sion_cojp/items/115e1671fcbc8f214aee 

https://liginc.co.jp/343687

 

JAVA 本番環境リリース時変更をなくす (プロキシサーバー)

開発環境がプロキシなし, 実行環境がプロキシありの場合、そのままでは動かないので、違う設定する必要ありますが、最小限に済ます方法です。
プロキシの設定は、httpclient, seleniumのconnect, jsoupのconnect, curlのシェル実行とかで多用するので、どこに居ても開発がはかどります。

1) web.xmlに使うか使わないかを設定


   <!-- Use proxy or not for curl command -->
  <context-param>
    <param-name>IsUseProxy</param-name> <param-value>0</param-value>
  </context-param>

2) 判別と、使う場合のcurlコマンドに使う引数を、静的設定用クラスに定義


  /**
   * プロキシ利用フラグ
   */
  public static boolean isUseProxy = false;
  /**
   * curl用プロキシ引数
   */
  public static final String ARG_PROXY_CURL = "--proxy http://10.70.1.80:8080";

3) JSPでの利用例


  // クレジットバランス用 //
  ServletContext cntxt = getServletContext();
  String crblcURL = cntxt.getInitParameter("CreditBalanceURL");
 
  crblc.setIsUseProxy(DBini.isUseProxy);

  crblc.setUrl(crblcURL);
  String crrest = crblc.getCreditBalance();
  pageContext.setAttribute("crrest", crrest);

        // == ツールバー == //
        var htmlds = 'From ' + "${dtpcsumsel}" +
                '<span style="margin-left:12px;">' + '${crrest}' + '</span>';
        $('#t_pcsum').prepend(htmlds); // 後でリフレッシュボタンを付けてるのでprepend

  /**
   * curlでクレジットバランス取得
   *
   * @return 文字列
   */
  public String getCreditBalance() {

    int res = 0;
    String proxy = this.isUseProxy ? DBini.ARG_PROXY_CURL: "";

    // コマンド文字列作成 //
    String curcmd = "curl -k --connect-timeout 5 " + proxy + " " + url;
    System.out.println(curcmd);

    String restxt = "";
    try {

      Runtime runtime = Runtime.getRuntime();
      Process p = runtime.exec(curcmd);
      InputStream is = p.getInputStream();

      // レスポンス取得 //
      int nread;
      byte[] rbuf = new byte[500];
      while ((nread = is.read(rbuf)) > 0) {
      }
      restxt = new String(rbuf, "US-ASCII");

    }
    catch (Exception e) {
      e.printStackTrace();
    }
    System.out.println(restxt);

    String blctxt = "";
    if (restxt != null) {
      int crblcstpos = restxt.indexOf("CREDIT_BALANCE=\"");
      int lastchgpos = restxt.indexOf("\" LAST_CHARGED");
      if (crblcstpos != -1 && lastchgpos != -1) {
        blctxt = restxt.substring(crblcstpos + 16, lastchgpos);
      }
      if (blctxt.indexOf("Connection timed out") > -1) {
        blctxt = "TimedOut";
      }
      if (blctxt.equals("")) {
        blctxt = "No Response";
      }
      return blctxt;
    }
    // エラー //
    else {     
      return "Error";
    }
  }

4) Servletでの利用例


    // コマンド //
    String curlcmd = "curl -k " + (DBini.isUseProxy ? DBini.ARG_PROXY_CURL: "")
            + (isSimple ? DBini.vesselPositionURLSimple : DBini.vesselPositionURL) + imo;
    System.out.println(curlcmd);

    // 開始時間取得 //
    long startTime = System.currentTimeMillis();

    VesselPosition vsp = new VesselPosition(DBini.tmNowFmt());

    String restxt = "";
    try {

      Runtime runtime = Runtime.getRuntime();
      Process p = runtime.exec(curlcmd);
      InputStream is = p.getInputStream();

      // レスポンス取得 //
      int nread;
      byte[] rbuf = new byte[2048];
      while ((nread = is.read(rbuf)) > 0) {
      }
      restxt = new String(rbuf, "US-ASCII");

    }
    catch (Exception e) {
      e.printStackTrace();
      vsp.setResmsg(this.FAIL_MESSAFE);
    }