Protected: IBM i PASE
Protected: New HTTP functions on IBM i
Protected: Security Testing
Protected: Secure OS – Tails
Protected: SQL Procedures Performance tuning
Protected: New cool SQL JSON functions on IBM i
Install Apigility on minimal CentOS. Connect Apigility on CentOS to IBM i DB2.
Step by step guide on how to install Apigility on latest CentOS with PHP 7, Redis, and MySQL.
- Log to minimal CentOS server as root. This assumes that the server has all required network components installed and configured and has an access to the internet.
 - Install EPEL and its repositories.
 
$ yum install epel-release $ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm $ rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm $ rpm -Uvh http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
- Install PHP 7
 
$ yum install php70w $ yum install php70w-mysql php70w-xml php70w-soap php70w-xmlrpc php70w-mbstring php70w-json php70w-gd php70w-mcrypt php70w-odbc.x86_64 php70w-pecl-redis
- Install Apache 2.4
 
$ yum --enablerepo=epel,remi install httpd $ systemctl start httpd $ systemctl enable httpd
- Install MySQL 5.6
 
$ yum install mysql-server $ systemctl start mysqld $ mysql_secure_installation $ systemctl restart mysqld $ systemctl enable mysqld
- Check LAMP versions
 
$ cat /etc/centos-release $ php –v $ httpd –v $ mysql –V
Command should return something like this:
CentOS Linux 7.2.1511 (Core) PHP 7.02.12 Apache 2.4.6 MySQL 5.6.34
- Install IBM i Access Driver
 
Upload package (ibm-iaccess-1.1.0.6-1.0.x86_64.rpm) to /opt/ibm directory
$ cd /opt/ibm $ rpm -ivh ibm-iaccess-1.1.0.6-1.0.x86_64.rpm
- Create ODBC.ini file
 
$ vi /etc/odbc.ini
Change sample values as needed:
[MYIBMISYSTEM] Description = Production IBM i DB2 Database Driver = IBM i Access ODBC Driver 64-bit System = MYIBMI.MYDOMAIN.COM UserID = myUserID Password = myUserPwd UNICODESQL = 1 DB2SQLSTATES = 1 ALLOWPROCCALLS = 1 Naming = 0 DefaultLibraries = IFNEEDED, *USRLIBL Database = MYDB2NAME ConnectionType = 0 CommitMode = 2 ExtendedDynamic = 1 DefaultPkgLibrary = QGPL DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512 AllowDataCompression = 1 LibraryView = 0 AllowUnsupportedChar = 0 ForceTranslation = 0 Trace = 0
We assume that you already have your networking configured. If not, here are some steps that can be used to do so:
- Set Static IP Address
 
Locate the name of your adapter in /etc/sysconfig/network-scripts directory. It’s name will begin with if ‘cfg-eno’. Copy the full name and use it is following command:
$ vi /etc/sysconfig/network-scripts/ifcfg-enoXXXXXXX
Paste following text and change it as needed:
TYPE=Ethernet BOOTPROTO="static" IPADDR=10.10.10.126 NETMASK=255.255.254.0 GATEWAY=10.10.10.254 DNS1=10.10.10.1 DNS2=8.8.8.8 NM_CONTROLLED=no DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no NAME=ens33 DEVICE=ens33 ONBOOT=yes PEERDNS=yes PEERROUTES=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes
- Set Hostname
 
$ vi /etc/hostname
Add your hostname on first line (example MYCENTOS7). Update also the network configuration file with the proper value for the host name:
$ vi /etc/sysconfig/network
Set proper values:
NETWORKING=yes HOSTNAME=MYCENTOS7
- Add other hosts to Host Configuration File
 
$ vi /etc/hosts
Sample entires:
127.0.0.1 MYCENTOS7 localhost.localdomain localhost4 localhost4.localdomain4 ::1 MYCENTOS7 localhost.localdomain localhost6 localhost6.localdomain6 10.10.10.55 MYIBMI.MYDOMAIN.COM MYIBMI
- Verify DB connection to IBM i server (via ODBC IBM i Access)
 
$ /opt/ibm/iSeriesAccess/bin64/cwbping MYIIBM
The result should look like this:
IBM i Access Client Solutions Version 1 Release 1 Level 0 Connection Verification Program (C) Copyright IBM Corporation and Others 1984, 2010. All rights reserved. U.S. Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. Licensed Materials - Property of IBM To cancel the CWBPING request, press CTRL-C or CTRL-BREAK I - Verifying connection to system MYIBMI... I - Successfully connected to server application: Central Client I - Successfully connected to server application: Network File I - Successfully connected to server application: Network Print I - Successfully connected to server application: Data Access I - Successfully connected to server application: Data Queues I - Successfully connected to server application: Remote Command I - Successfully connected to server application: Security I - Successfully connected to server application: DDM I - Successfully connected to server application: Telnet I - Connection verified to system MYIBMI
- Verify ODBC IBM i Access Driver configuration
 
$ isql -v MYIBMISYSTEM
The result should look like this:
+---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+
- Install OpenSSL
 
$ yum install mod_ssl openssl
- Create Virtual Host
 
Edit /etc/httpd/conf.d/ssl.conf file and create virtual hosts for secure communication:
$ vi /etc/httpd/conf.d/ssl.conf
Change values as needed:
Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
##
## SSL Virtual Host Context
##
<VirtualHost _default_:443>
DocumentRoot "/var/www/html/API7/public"
ServerName MYCENTOS7
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    		SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
    		SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
SetEnv APPLICATION_ENV "development"     
AllowEncodedSlashes On       
RewriteEngine on     
	<Location />         
		RewriteEngine On         
		RewriteCond %{REQUEST_FILENAME} -s [OR]         
		RewriteCond %{REQUEST_FILENAME} -l [OR]         
		RewriteCond %{REQUEST_FILENAME} -d          
		RewriteRule ^.*$ - [NC,L]         
		RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$         
		RewriteRule ^(.*) - [E=BASE:%1]         
		RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]     
	</Location>      
	<Directory "/var/www/html/API7/public">         
		Options Indexes MultiViews FollowSymLinks         
		DirectoryIndex index.php         
		AllowOverride None         
		Require all granted   
	</Directory> 
</VirtualHost>
- Open ports in Firewall
 
$ firewall-cmd --permanent --add-port=443/tcp $ firewall-cmd --add-port=3306/tcp $ firewall-cmd --permanent --add-port=3306/tcp $ firewall-cmd --add-port=6379/tcp $ firewall-cmd --permanent --add-port=6379/tcp
Reload the firewall:
$ firewall-cmd --reload
Once done, restart the Apache server:
$ systemctl restart httpd
- Set SELinux Permissions for Ports
 
$ yum -y install policycoreutils-python $ semanage port -a -t http_port_t -p tcp 443 $ semanage port -a -t http_port_t -p tcp 3306 $ semanage port -a -t http_port_t -p tcp 6379
and restart Apache:
$ systemctl restart httpd
We can also disable SELinux entirely:
$ sudo setenforce 0 $ systemctl restart httpd
- Set Time Zone
 
$ timedatectl list-timezones | grep America $ timedatectl set-timezone America/New_York
Verify configuration:
$ date $ ls -l /etc/localtime
- Configure NTP
 
$ vi /etc/chrony.conf
Add your NTP server to the top of the list:
# Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). server 10.10.10.66 prefer server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst
Restart Chrony:
$ systemctl restart chronyd
Check the synchronization sources:
$ chronyc sources –v $ chronyc sourcestats
- Install Redis
 
$ yum install redis $ redis-cli ping $ systemctl enable redis.service $ ss -nlp|grep redis
Configure Redis on Master server:
$ vi /etc/redis.conf
Replace content with following:
tcp-keepalive 60 #bind 127.0.0.1 requirepass your_redis_master_password appendonly yes appendfilename "appendonly.aof"
Configure Slave server; replace redis.conf with following:
#bind 127.0.0.1 requirepass your_redis_slave_password slaveof MYCENTOS7 6379 masterauth your_redis_master_password slave-read-only no
Verify Cluster Connectivity:
$ redis-cli -h 127.0.0.1 -p 6379
or
$ redis-cli -h masterIP -p 6379 $ AUTH your_redis_master_password $ INFO
- Install Apigility
 
Install the latest distribution package from Zend in /var/www/html/API7.
$ mkdir /var/www/html/API7 $ cd /var/www/html/API7 $ curl -sS https://apigility.org/install | php
- Set Files and Directories Permissions
 
This assumes that your Apigility installation is placed in /var/www/html/API7 directory.
$ chown apache:apache -R /var/www/html/
$ cd /var/www/html/
$ find . -type f -exec chmod 0644 {} \;
$ find . -type d -exec chmod 0755 {} \;
$ chcon -t httpd_sys_content_t /var/www/html/API7 –R
$ chcon -t httpd_sys_rw_content_t /var/www/html/API7/config –R
$ chcon -t httpd_sys_rw_content_t /var/www/html/API7/module –R
$ chcon -t httpd_sys_rw_content_t /var/www/html/API7/vendor –R
$ chcon -t httpd_sys_rw_content_t /var/www/html/API7/data –R
- Apache Performance
 
Find out what MPM is in use:
$ apachectl –M | grep mpm
or
$ httpd –V | grep MPM
Decide which MPM will be used and uncomment it in /etc/httpd/conf.modules.d/00-mpm.conf:
$ vi /etc/httpd/conf.modules.d/00-mpm.conf
# Select the MPM module which should be used by uncommenting exactly # one of the following LoadModule lines: # prefork MPM: Implements a non-threaded, pre-forking web server # See: http://httpd.apache.org/docs/2.4/mod/prefork.html #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server # See: http://httpd.apache.org/docs/2.4/mod/worker.html # LoadModule mpm_worker_module modules/mod_mpm_worker.so # event MPM: A variant of the worker MPM with the goal of consuming # threads only for connections with active processing # See: http://httpd.apache.org/docs/2.4/mod/event.html # #LoadModule mpm_event_module modules/mod_mpm_event.so
Create file /etc/httpd/conf.modules.d/10-worker.conf with flowing content:
<IfModule mpm_worker_module>
	ServerLimit             30
        StartServers            8
        MaxRequestWorkers       2048
        MinSpareThreads         256
        MaxSpareThreads         2048
        ThreadsPerChild         256
        ThreadLimit             256
        MaxConnectionsPerChild  0 
</IfModule>
- Troubleshooting:
 
UnixODBC error 08S01:
$ setsebool -P http_can_network_connect=1
- Update:
 
We recommend to upgrade PHP, OpenSSL, and Apache.
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum install yum-utils yum-config-manager --enable remi-php72 yum remove php* yum install php yum install php-mysql php-odbc php-xml php-soap php-xmlrpc php-mbstring php-mcrypt php-pecl-zip php-pecl-redis yum install php-pdo php-odbc php-mysql yum upgrade openssl yum upgrade httpd # get location of php.ini first from phpinfo() vi /etc/opt/remi/php72/php.ini timezone= America/New_York service httpd restart PATH=$PATH:/opt/remi/php72/root/usr/bin/ export PATH php -v
- References:
 
Connecting to IBM i DB2 from Linux Using 64-bit IBM i Access ODBC Driver
This comprehensive guide covers multiple methods to connect to IBM i DB2 from Linux, including ODBC, JDBC, Python, Node.js, PHP, and direct SQL session connections.
Prerequisites
- 64-bit Linux OS (x86_64)
 - Network access to IBM i system
 - Valid user credentials
 - Root/sudo access
 
Method 1: 64-bit ODBC Connection
Installation & Configuration
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y unixodbc unixodbc-dev
# RHEL/CentOS
sudo yum install -y unixODBC unixODBC-devel
# Install 64-bit driver
sudo dpkg -i ibm-iaccess-*_x86_64.deb  # Debian/Ubuntu
sudo rpm -ivh ibm-iaccess-*.x86_64.rpm  # RHEL/CentOSODBC Configuration (/etc/odbc.ini)
[IBMI64]
Description = IBM i 64-bit DB2 Connection
Driver = IBM i Access ODBC Driver 64-bit
System = your.ibmi.server
UserID = youruser
Password = yourpassword
Database = *SYSBAS
Naming = 1
CommitMode = 2Connection Examples
1. Python (pyodbc)
import pyodbc
conn = pyodbc.connect(
    "DRIVER={IBM i Access ODBC Driver 64-bit};"
    "SYSTEM=your.ibmi.server;"
    "UID=youruser;"
    "PWD=yourpassword;"
    "DATABASE=QGPL;"
)
cursor = conn.cursor()
cursor.execute("SELECT * FROM QIWS.QCUSTCDT")
print(cursor.fetchall())2. Node.js (node-odbc)
const odbc = require('odbc');
const connection = await odbc.connect(
  "DRIVER={IBM i Access ODBC Driver 64-bit};" +
  "SYSTEM=your.ibmi.server;" +
  "UID=youruser;" +
  "PWD=yourpassword;" +
  "DATABASE=QGPL;"
);
const result = await connection.query("SELECT * FROM QIWS.QCUSTCDT");
console.log(result);3. PHP (unixODBC)
<?php
$conn = odbc_connect("IBMI64", "youruser", "yourpassword");
$sql = "SELECT * FROM QIWS.QCUSTCDT";
$result = odbc_exec($conn, $sql);
while ($row = odbc_fetch_array($result)) {
    print_r($row);
}
odbc_close($conn);
?>4. Direct SQL Session (Command Line)
# Start interactive SQL session
/opt/ibm/iaccess/bin64/db2cli execsql -connstring "DATABASE=*SYSBAS;HOSTNAME=your.ibmi.server;UID=youruser;PWD=yourpassword"
# Execute single command
/opt/ibm/iaccess/bin64/db2cli execsql -connstring "DATABASE=*SYSBAS;HOSTNAME=your.ibmi.server;UID=youruser;PWD=yourpassword" -sql "SELECT * FROM QIWS.QCUSTCDT"JDBC Connection (Java)
// Using JTOpen (IBM Toolbox for Java)
String url = "jdbc:as400://your.ibmi.server;libraries=QGPL";
Connection conn = DriverManager.getConnection(url, "youruser", "yourpassword");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM QIWS.QCUSTCDT");Troubleshooting
| Issue | Solution | 
|---|---|
| Driver not found | Verify path: /opt/ibm/iaccess/lib64 | 
| Connection timeout | Check firewall and port 8471 | 
| Authentication failure | Verify user profile on IBM i | 
Best Practices
- Use TLS encryption for production
 - Implement connection pooling
 - Follow principle of least privilege
 - Consider using SSH tunneling for remote connections
 
This guide provides multiple approaches to connect to IBM i DB2 from Linux, allowing you to choose the best method for your specific application needs.