Travis CI 사용

github를 사용하다가 얼마전부터 Travis CI 를 연동해서 사용해보기로 했다.

외부 라이브러리를 전혀 쓰지 않게 되어있는 URLParser는 빌드에 어려움이 없었지만, 외부라이브러리를 가져다 쓰는 DServer는 빌드에 애로사항이 많았다.

빌드명령어는 https://arne-mertz.de/2017/04/continuous-integration-travis-ci/ 를 참조했다.

일단 나는 CentOS에서만 빌드하고 테스트했었기 때문에 Travis CI가 빌드에 사용하는 Ubuntu 리눅스에 맞추도록 해야했다.

일단 사용했던 라이브러리인 jemalloc 에서부터 에러가 났다. VS2015에 라이브러리를 빌드할 수 있는 모든 파일들이 포함되어 있긴했지만 이걸 또 빌드하려면 여러가지 명령을 넣어야하는 상황. 구글을 뒤져서 travis에서 빌드전 libjemalloc-dev 패키지를 설치하도록 추가했다.

다시 빌드하려고 하니 이번엔 json 패키지에서 에러가 났다. 역시 모든 파일이 포함되어 있지만 이걸 빌드하기에는 복잡하니 다시 라이브러리를 추가하도록 했다.

우분투에서 패키지 검색은

sudo apt-cache search [패키지명]

를 사용하면 된다.

빌드전 설치 패키지에 libjsoncpp-dev 를 추가한다. 이것만으로 안되서 libjson0 libjson0-dev 도 추가했다. 이제 다시 빌드하면…

기대도 안했지만 역시 에러난다. boost 관련 에러가 뜬다. 그런데 boost가 어떤 패키지에 담겨있는지 알수가 없는 상황.

https://docs.travis-ci.com/user/build-environment-updates/2017-11-01/

를 보니 boost 1.65가 있다고는 한다. 결국에는 apt-cache search 명령으로 패키지 목록을 찾아냈다. 2018년 12월 26일 기준으로 boost 와 관련된 라이브러리 목록은 다음과 같다.

before_install.1
0.28s$ sudo apt-cache search boost
libboost-chrono-dev - C++ representation of time duration, time point, and clocks (default version)
libboost-date-time-dev - set of date-time libraries based on generic programming concepts (default version)
libboost-dbg - Boost C++ Libraries with debug symbols (default version)
libboost-dev - Boost C++ Libraries development files (default version)
libboost-doc - Boost.org libraries documentation (default version)
libboost-filesystem-dev - filesystem operations (portable paths, iteration over directories, etc) in C++ (default version)
libboost-iostreams-dev - Boost.Iostreams Library development files (default version)
libboost-program-options-dev - program options library for C++ (default version)
libboost-python-dev - Boost.Python Library development files (default version)
libboost-regex-dev - regular expression library for C++ (default version)
libboost-serialization-dev - serialization library for C++ (default version)
libboost-system-dev - Operating system (e.g. diagnostics support) library (default version)
libboost-test-dev - components for writing and executing test suites (default version)
libboost-thread-dev - portable C++ multi-threading (default version)
libboost-all-dev - Boost C++ Libraries development files (ALL) (default version)
libboost-atomic-dev - atomic data types, operations, and memory ordering constraints (default version)
libboost-atomic1.55-dev - atomic data types, operations, and memory ordering constraints
libboost-atomic1.55.0 - atomic data types, operations, and memory ordering constraints
libboost-chrono1.55-dev - C++ representation of time duration, time point, and clocks
libboost-chrono1.55.0 - C++ representation of time duration, time point, and clocks
libboost-context-dev - provides a sort of cooperative multitasking on a single thread (default version)
libboost-context1.55-dev - provides a sort of cooperative multitasking on a single thread
libboost-context1.55.0 - provides a sort of cooperative multitasking on a single thread
libboost-coroutine-dev - provides a sort of cooperative multitasking on a single thread (default version)
libboost-coroutine1.55-dev - provides a sort of cooperative multitasking on a single thread
libboost-date-time1.55-dev - set of date-time libraries based on generic programming concepts
libboost-date-time1.55.0 - set of date-time libraries based on generic programming concepts
libboost-exception-dev - library to help write exceptions and handlers (default version)
libboost-exception1.55-dev - library to help write exceptions and handlers
libboost-filesystem1.55-dev - filesystem operations (portable paths, iteration over directories, etc) in C++
libboost-filesystem1.55.0 - filesystem operations (portable paths, iteration over directories, etc) in C++
libboost-geometry-utils-perl - Perl module providing bindings to the Boost Geometry library
libboost-graph-dev - generic graph components and algorithms in C++ (default version)
libboost-graph-parallel-dev - generic graph components and algorithms in C++ (default version)
libboost-graph-parallel1.55-dev - generic graph components and algorithms in C++
libboost-graph-parallel1.55.0 - generic graph components and algorithms in C++
libboost-graph1.55-dev - generic graph components and algorithms in C++
libboost-graph1.55.0 - generic graph components and algorithms in C++
libboost-iostreams1.55-dev - Boost.Iostreams Library development files
libboost-iostreams1.55.0 - Boost.Iostreams Library
libboost-locale-dev - C++ facilities for localization (default version)
libboost-locale1.55-dev - C++ facilities for localization
libboost-locale1.55.0 - C++ facilities for localization
libboost-log-dev - C++ logging library (default version)
libboost-log1.55-dev - C++ logging library
libboost-log1.55.0 - C++ logging library
libboost-math-dev - Boost.Math Library development files (default version)
libboost-math1.55-dev - Boost.Math Library development files
libboost-math1.55.0 - Boost.Math Library
libboost-mpi-dev - C++ interface to the Message Passing Interface (MPI) (default version)
libboost-mpi-python-dev - C++ interface to the Message Passing Interface (MPI), Python Bindings (default version)
libboost-mpi-python1.55-dev - C++ interface to the Message Passing Interface (MPI), Python Bindings
libboost-mpi-python1.55.0 - C++ interface to the Message Passing Interface (MPI), Python Bindings
libboost-mpi1.55-dev - C++ interface to the Message Passing Interface (MPI)
libboost-mpi1.55.0 - C++ interface to the Message Passing Interface (MPI)
libboost-program-options1.55-dev - program options library for C++
libboost-program-options1.55.0 - program options library for C++
libboost-python1.55-dev - Boost.Python Library development files
libboost-python1.55.0 - Boost.Python Library
libboost-random-dev - Boost Random Number Library (default version)
libboost-random1.55-dev - Boost Random Number Library
libboost-random1.55.0 - Boost Random Number Library
libboost-regex1.55-dev - regular expression library for C++
libboost-regex1.55.0 - regular expression library for C++
libboost-serialization1.55-dev - serialization library for C++
libboost-serialization1.55.0 - serialization library for C++
libboost-signals-dev - managed signals and slots library for C++ (default version)
libboost-signals1.55-dev - managed signals and slots library for C++
libboost-signals1.55.0 - managed signals and slots library for C++
libboost-system1.55-dev - Operating system (e.g. diagnostics support) library
libboost-system1.55.0 - Operating system (e.g. diagnostics support) library
libboost-test1.55-dev - components for writing and executing test suites
libboost-test1.55.0 - components for writing and executing test suites
libboost-thread1.55-dev - portable C++ multi-threading
libboost-thread1.55.0 - portable C++ multi-threading
libboost-timer-dev - C++ wall clock and CPU process timers (default version)
libboost-timer1.55-dev - C++ wall clock and CPU process timers
libboost-timer1.55.0 - C++ wall clock and CPU process timers
libboost-tools-dev - Boost C++ Libraries development tools (default version)
libboost-wave-dev - C99/C++ preprocessor library (default version)
libboost-wave1.55-dev - C99/C++ preprocessor library
libboost-wave1.55.0 - C99/C++ preprocessor library
libboost1.55-all-dev - Boost C++ Libraries development files (ALL)
libboost1.55-dbg - Boost C++ Libraries with debug symbols
libboost1.55-dev - Boost C++ Libraries development files
libboost1.55-doc - Boost.org libraries documentation
libboost1.55-tools-dev - Boost C++ Libraries development tools
libjson-spirit-dev - C++ JSON Parser/Generator implemented with Boost Spirit
pianobooster - learn the piano just by playing a game
pianobooster-dbg - learn the piano just by playing a game - debug
python-minieigen - Small boost::python wrapper of parts of the Eigen library
python-py++ - OO-framework for creating a code generator for Boost.Python
r-cran-gbm - GNU R package "Generalized Boosted Regression Models"
libboost-atomic1.54-dev - atomic data types, operations, and memory ordering constraints
libboost-atomic1.54.0 - atomic data types, operations, and memory ordering constraints
libboost-chrono1.54-dev - C++ representation of time duration, time point, and clocks
libboost-chrono1.54.0 - C++ representation of time duration, time point, and clocks
libboost-date-time1.54-dev - set of date-time libraries based on generic programming concepts
libboost-date-time1.54.0 - set of date-time libraries based on generic programming concepts
libboost-filesystem1.54-dev - filesystem operations (portable paths, iteration over directories, etc) in C++
libboost-filesystem1.54.0 - filesystem operations (portable paths, iteration over directories, etc) in C++
libboost-iostreams1.54-dev - Boost.Iostreams Library development files
libboost-iostreams1.54.0 - Boost.Iostreams Library
libboost-program-options1.54-dev - program options library for C++
libboost-program-options1.54.0 - program options library for C++
libboost-python1.54-dev - Boost.Python Library development files
libboost-python1.54.0 - Boost.Python Library
libboost-regex1.54-dev - regular expression library for C++
libboost-regex1.54.0 - regular expression library for C++
libboost-serialization1.54-dev - serialization library for C++
libboost-serialization1.54.0 - serialization library for C++
libboost-system1.54-dev - Operating system (e.g. diagnostics support) library
libboost-system1.54.0 - Operating system (e.g. diagnostics support) library
libboost-test1.54-dev - components for writing and executing test suites
libboost-test1.54.0 - components for writing and executing test suites
libboost-thread1.54-dev - portable C++ multi-threading
libboost-thread1.54.0 - portable C++ multi-threading
libboost1.54-dbg - Boost C++ Libraries with debug symbols
libboost1.54-dev - Boost C++ Libraries development files
libboost1.54-doc - Boost.org libraries documentation
libboost1.54-tools-dev - Boost C++ Libraries development tools
libboost-context1.54-dev - provides a sort of cooperative multitasking on a single thread
libboost-context1.54.0 - provides a sort of cooperative multitasking on a single thread
libboost-coroutine1.54-dev - provides a sort of cooperative multitasking on a single thread
libboost-exception1.54-dev - library to help write exceptions and handlers
libboost-graph-parallel1.54-dev - generic graph components and algorithms in C++
libboost-graph-parallel1.54.0 - generic graph components and algorithms in C++
libboost-graph1.54-dev - generic graph components and algorithms in C++
libboost-graph1.54.0 - generic graph components and algorithms in C++
libboost-locale1.54-dev - C++ facilities for localization
libboost-locale1.54.0 - C++ facilities for localization
libboost-log1.54-dev - C++ logging library
libboost-log1.54.0 - C++ logging library
libboost-math1.54-dev - Boost.Math Library development files
libboost-math1.54.0 - Boost.Math Library
libboost-mpi-python1.54-dev - C++ interface to the Message Passing Interface (MPI), Python Bindings
libboost-mpi-python1.54.0 - C++ interface to the Message Passing Interface (MPI), Python Bindings
libboost-mpi1.54-dev - C++ interface to the Message Passing Interface (MPI)
libboost-mpi1.54.0 - C++ interface to the Message Passing Interface (MPI)
libboost-random1.54-dev - Boost Random Number Library
libboost-random1.54.0 - Boost Random Number Library
libboost-signals1.54-dev - managed signals and slots library for C++
libboost-signals1.54.0 - managed signals and slots library for C++
libboost-timer1.54-dev - C++ wall clock and CPU process timers
libboost-timer1.54.0 - C++ wall clock and CPU process timers
libboost-wave1.54-dev - C99/C++ preprocessor library
libboost-wave1.54.0 - C99/C++ preprocessor library
libboost1.54-all-dev - Boost C++ Libraries development files (ALL)

libboost-dev를 설치하고 보니 이번에는 mysql 라이브러리가 잡히지 않아서 또 에러. 검색해보니 오늘 날짜 기준으로 mysql 관련 라이브러리는 다음과 같았다.

before_install.1
0.30s$ sudo apt-cache search mysql
bacula-common-mysql - network backup service - MySQL common files
bacula-common-mysql-dbg - network backup service - MySQL common files (debugging)
bacula-director-mysql - network backup service - MySQL storage for Director
bacula-director-mysql-dbg - network backup service - MySQL storage for Director (debugging)
bacula-sd-mysql - network backup service - MySQL SD tools
bacula-sd-mysql-dbg - network backup service - MySQL SD tools (debugging)
libapache2-mod-auth-mysql - Apache 2 module for MySQL authentication
libdatetime-format-mysql-perl - Parse and format MySQL dates and times
libdbd-mysql - MySQL database server driver for libdbi
libmysqlcppconn-dev - MySQL Connector for C++ (development files)
libmysqlcppconn7 - MySQL Connector for C++ (library)
python-mysqldb - Python interface to MySQL
python-mysqldb-dbg - Python interface to MySQL (debug extension)
aolserver4-nsmysql - AOLserver 4 module: module for accessing MySQL databases
asterisk-mysql - MySQL database protocol support for the Asterisk PBX
cl-sql-mysql - CLSQL database backend, MySQL
courier-authlib-mysql - MySQL support for the Courier authentication library
cvm-mysql - Credential Validation Modules (MySQL)
dbf2mysql - xBase <--> MySQL
dpm-copy-server-mysql - DPM copy server with MySQL database backend
dpm-name-server-mysql - DPM nameserver server with MySQL database backend
dpm-server-mysql - Disk Pool Manager (DPM) server with MySQL database backend
dpm-srm-server-mysql - DPM SRM server with MySQL database backend
dpsyco-mysql - Automate administration of access to mysql
dsyslog-module-mysql - advanced modular syslog daemon - MySQL support
emma - extendable MySQL managing assistant
falconpl-dbi-mysql - MySQL database abstraction layer for Falcon P.L
gambas3-gb-db-mysql - MySQL driver for the Gambas database component
gambas3-gb-mysql - Gambas MySQL component
gmysqlcc - graphical client for managing MySQL databases
gnokii-smsd-mysql - SMSD plugin for MySQL storage backend
gsql-mysql-engine - MySQL engine for GSQL
handlersocket-mysql-5.5 - HandlerSocket plugin for MySQL 5.5
kamailio-mysql-modules - MySQL database connectivity module for Kamailio
kexi-mysql-driver - MySQL support for kexi
letodms - document management system based on PHP and MySQL
lfc-server-mysql - LCG File Catalog (LFC) server with MySQL database backend
libapache2-mod-log-sql-mysql - Use SQL to store/write your Apache queries logs - MySQL interface
libaprutil1-dbd-mysql - Apache Portable Runtime Utility Library - MySQL Driver
libclass-dbi-mysql-perl - extensions to Class::DBI for MySQL
libcrypt-mysql-perl - Perl module to emulate the MySQL PASSWORD() function
libdbd-mysql-ruby - Transitional package for ruby-dbd-mysql
libdbd-mysql-ruby1.8 - Transitional package for ruby-dbd-mysql
libdbd-mysql-ruby1.9.1 - Transitional package for ruby-dbd-mysql
libdbix-fulltextsearch-perl - Indexing documents with MySQL as storage
libdspam7-drv-mysql - MySQL backend for DSPAM anti-spam filter
libgda-5.0-mysql - MySQL provider for libgda database abstraction library
libghc-hsql-mysql-dev - MySQL driver of the HSQL library for GHC
libghc-hsql-mysql-doc - API documentation of the hsql-mysql library for Haskell
libghc-hsql-mysql-prof - MySQL driver of the HSQL library for GHC; profiling libraries
libkaya-mysql-dev - MySQL binding for kaya
libmyodbc - the MySQL ODBC driver
libmysql++-dev - MySQL C++ library bindings (development)
libmysql++-doc - MySQL C++ library bindings (documentation and examples)
libmysql++3 - MySQL C++ library bindings (runtime)
libmysql-cil-dev - MySQL database connector for CLI
libmysql-diff-perl - module for comparing the table structure of two MySQL databases
libmysql-java - Java database (JDBC) driver for MySQL
libmysql-ocaml - OCaml bindings for MySql (runtime package)
libmysql-ocaml-dev - OCaml bindings for MySql (development package)
libmysql6.4-cil - MySQL database connector for CLI
libnss-mysql-bg - NSS module for using MySQL as a naming service
libopendbx1-mysql - MySQL backend for OpenDBX
libpam-mysql - PAM module allowing authentication from a MySQL server
librdf-storage-mysql - RDF library, MySQL backend
libtime-piece-mysql-perl - module adding MySQL-specific methods to Time::Piece
libwtdbomysql-dev - MySQL/MariaDB backend for Wt::Dbo [development]
libwtdbomysql35 - MySQL/MariaDB backend for Wt::Dbo [runtime]
lighttpd-mod-mysql-vhost - MySQL-based virtual host configuration for lighttpd
lua-dbi-mysql - DBI library for the Lua language, MySQL backend
lua-dbi-mysql-dbg - DBI library for the Lua language, MySQL backend debug symbols
lua-dbi-mysql-dev - DBI library for the Lua language, MySQL development files
lua-sql-mysql - luasql library for the Lua language
lua-sql-mysql-dev - luasql development files for the Lua language
mha4mysql-manager - Master High Availability Manager and Tools for MySQL, Manager Package
mha4mysql-node - Master High Availability Manager and Tools for MySQL, Node Package
monodoc-mysql-manual - compiled XML documentation for the MySql.Data library
mydumper - High-performance MySQL backup tool
mylvmbackup - quickly creating backups of MySQL server's data files
mysql-mmm-agent - Multi-Master Replication Manager for MySQL - agent daemon
mysql-mmm-common - Multi-Master Replication Manager for MySQL - common files
mysql-mmm-monitor - Multi-Master Replication Manager for MySQL - monitoring daemon
mysql-mmm-tools - Multi-Master Replication Manager for MySQL - tools
mysql-proxy - high availability, load balancing and query modification for mysql
mysql-utilities - collection of scripts for managing MySQL servers
mysql-workbench - MySQL Workbench - a visual database modeling, administration and queuing tool
mysql-workbench-data - MySQL Workbench -- architecture independent data
mysqltcl - interface to the MySQL database for the Tcl language
mysqltuner - high-performance MySQL tuning script
mysqmail - real-time logging system in MySQL
mysqmail-courier-logger - real-time logging system in MySQL - Courier traffic-logger
mysqmail-dovecot-logger - real-time logging system in MySQL - Dovecot traffic-logger
mysqmail-postfix-logger - real-time logging system in MySQL - Postfix traffic-logger
mysqmail-pure-ftpd-logger - real-time logging system in MySQL - Pure-FTPd traffic-logger
mytop - top like query monitor for MySQL
ndoutils-nagios3-mysql - This provides the NDOUtils for Nagios with MySQL support
node-mysql - MySQL client implementation for Node.js
nuauth-log-mysql - The authenticating firewall [MySQL log module]
oar-server-mysql - OAR batch scheduler MySQL server backend package
oar-user-mysql - OAR batch scheduler MySQL user backend package
opendnssec-dbg-mysql - Debug symbols for OpenDNSSEC (Enforcer with MySQL support)
opendnssec-enforcer-mysql - tool to prepare DNSSEC keys (mysql backend)
parser3-mysql - MySQL driver for Parser 3
pennmush-mysql - text-based multi-user virtual world server with MySQL support
percona-toolkit - Command-line tools for MySQL and system tasks
perdition-mysql - Library to allow perdition to access MySQL based popmaps
php-mdb2-driver-mysql - PHP PEAR module to provide a MySQL driver for MDB2
php5-mysqlnd-ms - MySQL replication and load balancing module for PHP
pike7.8-mysql - MySQL modules for Pike
postfix-cluebringer-mysql - metapackage for mysql support in postfix-cluebringer
postfix-gld - greylisting daemon for postfix, written in C, uses MySQL
puppet-module-puppetlabs-mysql - Puppet module for mysql
python-mysql.connector - pure Python implementation of MySQL Client/Server protocol
python3-mysql.connector - pure Python implementation of MySQL Client/Server protocol (Python3)
r-cran-rmysql - GNU R package providing a DBI-compliant interface to MySQL
ratbox-services-mysql - IRC services for use with ircd-ratbox with the mysql backend
redmine-mysql - metapackage providing MySQL dependencies for Redmine
root-plugin-sql-mysql - MySQL client plugin for ROOT
roundcube-mysql - metapackage providing MySQL dependencies for RoundCube
rt4-db-mysql - MySQL database backend for request-tracker4
ruby-dataobjects-mysql - MySQL adapter for ruby-dataobjects
ruby-dbd-mysql - Ruby/DBI MySQL driver
ruby-mysql - MySQL module for Ruby
ruby-mysql2 - simple, fast MySQL library for Ruby
spl-mysql - SPL Programming Language -- MySQL adapter
tarantool-mysql-plugin - Tarantool in-memory database - MySQL connector
tcl8.6-tdbc-mysql - Tcl Database Connectivity
tntdb-mysql4 - MySQL backend for tntdb database access library
ukolovnik - Simple todo manager using PHP and MySQL
ulogd-mysql - transitional dummy package for ulogd2-mysql
ulogd2-mysql - MySQL extension to ulogd
voms-mysql-plugin - VOMS server plugin for MySQL
voms-mysql-plugin-dbg - VOMS server plugin for MySQL - Debug Symbols
yate-mysql - MySQL support module for yate
zabbix-proxy-mysql - network monitoring solution - proxy (using MySQL)
zabbix-server-mysql - network monitoring solution - server (using MySQL)
exim4-daemon-heavy - Exim MTA (v4) daemon with extended features, including exiscan-acl
libdbd-mysql-perl - Perl5 database interface to the MySQL database
libmysqlclient-dev - MySQL database development files
libmysqlclient18 - MySQL database client library
libmysqld-dev - MySQL embedded database development files
libqt4-sql-mysql - Qt 4 MySQL database driver
libreoffice-base-drivers - Database connectvity drivers for LibreOffice
mysql-client - MySQL database client (metapackage depending on the latest version)
mysql-client-5.5 - MySQL database client binaries
mysql-client-core-5.5 - MySQL database core client binaries
mysql-common - MySQL database common files, e.g. /etc/mysql/my.cnf
mysql-server - MySQL database server (metapackage depending on the latest version)
mysql-server-5.5 - MySQL database server binaries and system database setup
mysql-server-core-5.5 - MySQL database server binaries
nova-api - OpenStack Compute - API frontend
nova-cert - OpenStack Compute - certificate management
nova-common - OpenStack Compute - common files
nova-compute - OpenStack Compute - compute node base
nova-compute-kvm - OpenStack Compute - compute node (KVM)
nova-compute-libvirt - OpenStack Compute - compute node libvirt support
nova-compute-lxc - OpenStack Compute - compute node (LXC)
nova-doc - OpenStack Compute - documentation
nova-network - OpenStack Compute - Network manager
nova-objectstore - OpenStack Compute - object store
nova-scheduler - OpenStack Compute - virtual machine scheduler
nova-volume - OpenStack Compute - storage
php5-mysql - MySQL module for php5
php5-sqlite - SQLite module for php5
postfix-mysql - MySQL map support for Postfix
python-nova - OpenStack Compute Python libraries
rsyslog - reliable system and kernel logging daemon
strongswan-plugin-mysql - strongSwan plugin for MySQL
strongswan-plugin-sql - strongSwan plugin for SQL configuration and credentials
akonadi-backend-mysql - MySQL storage backend for Akonadi
automysqlbackup - daily, weekly and monthly backup for your MySQL database
cacti - web interface for graphing of monitoring systems
collectd-core - statistics collection and monitoring daemon (core system)
dovecot-mysql - secure POP3/IMAP server - MySQL support
drizzle - Server binaries for Drizzle Database
drizzle-client - Client binaries for Drizzle Database
drizzle-dbg - Debugging symbols for Drizzle
drizzle-dev-doc - API Documentation for drizzle
drizzle-doc - Documentation for Drizzle
drizzle-plugin-auth-file - File-based authentication for Drizzle
drizzle-plugin-auth-http - HTTP authentication for Drizzle
drizzle-plugin-auth-ldap - LDAP authentication for Drizzle
drizzle-plugin-auth-pam - PAM authentication for Drizzle
drizzle-plugin-auth-schema - Schema authentication for Drizzle
drizzle-plugin-debug - Plugin that facilitates debugging Drizzle
drizzle-plugin-dev - Development files for Drizzle plugin development
drizzle-plugin-gearman-udf - Gearman User Defined Functions for Drizzle
drizzle-plugin-http-functions - HTTP Functions for Drizzle
drizzle-plugin-js - Javascript plugin for Drizzle
drizzle-plugin-json-server - JSON HTTP (NoSQL) interface for Drizzle
drizzle-plugin-logging-gearman - Gearman Logging for Drizzle
drizzle-plugin-logging-query - Query Logging for Drizzle
drizzle-plugin-perf-dictionary - Performance Dictionary for Drizzle
drizzle-plugin-query-log - Query logging for Drizzle
drizzle-plugin-rabbitmq - RabbitMQ Transaction Log for Drizzle
drizzle-plugin-regex-policy - Regex based authorization rules for Drizzle
drizzle-plugin-simple-user-policy - Simple User Policy for Drizzle
drizzle-plugin-slave - Replication Slave Plugin for Drizzle
freeradius-mysql - MySQL module for FreeRADIUS server
gnash-ext-mysql - GNU Shockwave Flash (SWF) player - MySQL extension
libdrizzle-dbg - library for the Drizzle and MySQL protocols, debug symbols
libdrizzle-dev - library for the Drizzle and MySQL protocols, development files
libdrizzle4 - library for the Drizzle and MySQL protocols
libdrizzledmessage-dev - Devel library containing serialized messages used with Drizzle
libdrizzledmessage0 - Library containing serialized messages used with Drizzle
libmariadbclient-dev - MariaDB database development files
libmariadbd-dev - MariaDB embedded database development files
libmysqld-pic - PIC version of MySQL embedded server development files
libphp-adodb - ADOdb database abstraction layer for PHP
libpocomysql9 - C++ Portable Components (POCO) MySQL library
libpocomysql9-dbg - C++ Portable Components (POCO) MySQL library (debug version)
libqt5sql5-mysql - Qt 5 MySQL database driver
libreoffice-mysql-connector - MariaDB/MySQL Connector extension for LibreOffice
libtango8 - TANGO distributed control system - shared library
libtango8-dbg - TANGO distributed control system - debug library
libtango8-dev - TANGO distributed control system - development library
libtango8-doc - TANGO distributed control system - documentation
mariadb-client-5.5 - MariaDB database client binaries
mariadb-client-core-5.5 - MariaDB database core client binaries
mariadb-server-5.5 - MariaDB database server binaries
mariadb-server-core-5.5 - MariaDB database core server files
mariadb-test-5.5 - MariaDB database regression test suite
mysql-client-5.6 - MySQL database client binaries
mysql-client-core-5.6 - MySQL database core client binaries
mysql-common-5.6 - MySQL 5.6 specific common files, e.g. /etc/mysql/conf.d/my-5.6.cnf
mysql-server-5.6 - MySQL database server binaries and system database setup
mysql-server-core-5.6 - MySQL database server binaries
mysql-source-5.5 - MySQL source
mysql-source-5.6 - MySQL source
mysql-testsuite - MySQL testsuite
mysql-testsuite-5.5 - MySQL testsuite
mysql-testsuite-5.6 - MySQL 5.6 testsuite
nova-ajax-console-proxy - OpenStack Compute - AJAX console proxy - transitional package
nova-api-ec2 - OpenStack Compute - EC2 API frontend
nova-baremetal - Openstack Compute - baremetal virt
nova-cells - Openstack Compute - cells
nova-compute-qemu - OpenStack Compute - compute node (QEmu)
nova-compute-vmware - OpenStack Compute - compute node (VMware)
nova-compute-xen - OpenStack Compute - compute node (Xen)
nova-conductor - OpenStack Compute - conductor service
nova-console - OpenStack Compute - Console
nova-consoleauth - OpenStack Compute - Console Authenticator
nova-novncproxy - OpenStack Compute - NoVNC proxy
nova-spiceproxy - OpenStack Compute - spice html5 proxy
nova-xvpvncproxy - OpenStack Compute - XVP VNC proxy
owncloud - empty package
pdns-backend-mysql - generic MySQL backend for PowerDNS
percona-xtradb-cluster-client-5.5 - Percona Server database client binaries
percona-xtradb-cluster-common-5.5 - Percona Server database common files
percona-xtradb-cluster-server-5.5 - Percona Server database server binaries
percona-xtradb-cluster-testsuite-5.5 - Percona Server database test suite
php5-mysqlnd - MySQL module for php5 (Native Driver)
phpmyadmin - MySQL web administration tool
pinba-engine-mysql-5.5 - realtime statistics server for PHP using MySQL as a read-only interface
proftpd-mod-mysql - Versatile, virtual-hosting FTP daemon - MySQL module
pure-ftpd-mysql - Secure and efficient FTP server with MySQL user authentication
rsyslog-mysql - MySQL output plugin for rsyslog
tango-db - TANGO distributed control system - database server
viewvc-query - utility to query CVS and Subversion commit database
mythtv-database - Personal video recorder application (database)
cl-pgloader - extract, transform and load data into PostgreSQL
cl-qmynd - MySQL Native Driver for Common Lisp
pgloader - extract, transform and load data into PostgreSQL
postgresql-10-mysql-fdw - Postgres 10 Foreign Data Wrapper for MySQL
postgresql-11-mysql-fdw - Postgres 11 Foreign Data Wrapper for MySQL
postgresql-9.3-mysql-fdw - Postgres 9.3 Foreign Data Wrapper for MySQL
postgresql-9.4-mysql-fdw - Postgres 9.4 Foreign Data Wrapper for MySQL
postgresql-9.5-mysql-fdw - Postgres 9.5 Foreign Data Wrapper for MySQL
postgresql-9.6-mysql-fdw - Postgres 9.6 Foreign Data Wrapper for MySQL
postgresql-mysql-fdw-doc - documentation for mysql-fdw

이 중에서 libmysqlcppconn-dev, libmysqlcppconn7, libmysql++-dev, libmysql++3 이렇게 4개의 패키지를 추가했다.

다시 빌드해보니… 안된다.

이번에는 tchar.h 에러. 이건 윈도우에만 있는 헤더… 문제는 MSSQL 관련 파일들이었다. 윈도우에서만 사용되도록 define 해주고 다시 커밋.

이 이외에도 무수히 많은 에러를 수정하며 지나가야했다. git-flow로 아예 브랜치를 별도로 만들어서 처리해나갔다.

  • strncpy_s 문제 : MS 전용이다. strncpy 로 함수 변경
  • boost::filesystem::ofstream을 std::ofstream으로 변경 : 함수 인자를 모두 수정해주어야 한다. 두 함수는 이름은 같지만 인자의 타입이 다르다.
  • __super 사용 금지 : MS 전용이다. gcc에서는 __super 사용 금지. typedef로 기본클래스를 지정해서 사용해야한다. ( https://goo.gl/hSeG97 )
  • 몇군데 rvalue reference에 대한 수정도 필요했다.

여기까지 수정했음에도 여전히 많은 오류에 부딪혔다.

결국 리눅스 빌드는 나중에 해보기로 하고 윈도우에서 빌드를 시작하는 것으로…

AppVeyor 사용기

Travis-CI 에서 윈도우 빌드가 되지 않아 고민하던 중…

새로운 CI 서비스를 찾았다. AppVeyor인데 앱베요인지 앱비요인지 앱베이요인지 뭐라고 읽어야할지 잘 모르겠다. 이 서비스는 Travis-CI와 같은 리눅스 빌드 외에도 윈도우에서 VisualStudio를 통한 빌드를 지원한다.

Appveyor는 Travis-CI처럼 yml 파일로도 설정해줄 수 있지만 웹사이트에서 바로 설정을 수정할 수 있기 때문에 아무래도 사용하기가 많이 편리했다.

Boost 라이브러리는 프로젝트 속성에 절대경로로 지정하던 것을 윈도우 시스템 환경변수로 뺐고, appveyor 에서는 프로젝트 설정에 환경변수로 넣어주었다.

MySQL 커넥터 라이브러리에서도 충돌이 생겼는데, appveyor 에는 MySQL ODBC 드라이버만 지원하고 있었다. 나는 리눅스에서도 빌드되게 하려고 따로 MySQL-C++-Connector를 사용하고 있다. 일단 이 라이브러리를 솔루션에 포함시키는 것으로 해결했다. 차후에는 ODBC 버전까지 같이 지원하도록 만드는 것이 나을 것 같다.

boost와 mysql을 해결하고 json과 jemalloc 라이브러리가 먼저 빌드되고 그다음 유틸리티 라이브러리, 네트워크 라이브러리 순서로 빌드하기 위해 솔루션 설정에서 프로젝트 종속성을 설정해주었다.

다시 빌드하자….

게임서버, 브릿지서버 둘다 빌드 성공.

확실히 GCC나 G++를 이용하는 빌드보다는 훨씬 쉬운 느낌이다.

Google Breakpad 설치 (2)

gyp 파일을 다 실행하고 나면 솔루션 파일과 프로젝트 파일 등이 생겨난다. 비주얼스튜디오로 솔루션 파일을 열어보면 다음과 같이 여러개의 프로젝트가 솔루션 안에 들어있다.

K-007

맨 밑에 build_all 프로젝트를 빌드해보면…

84개의 오류와 28개의 경고로 빌드가 안된다. 뭐 어차피 기대도 안했다.

에러메시지를 보면

#include "testing/gtest/include/gtest/gtest.h"
#include "testing/include/gmock/gmock.h"

이 부분에서부터 에러가 시작된다. gtest와 gmock이 필요하다고 한다. 이건 아마 외부라이브러리인 모양.

이 패키지들은 https://github.com/google/googletest 에서 받을 수 있다. 이 레포지토리를 git으로 클론한다. 다운로드 받으면 googlemock과 googletest다 들어있으며, 각 디렉토리에 msvc 라는 디렉토리가 있고 여기에 비주얼스튜디오로 열 수 있는 솔루션 파일과 프로젝트 파일들이 들어있다.

솔루션 파일들을 열어서 실행해보면 .lib 파일들이 생성된다. 이것들은 지금 당장은 필요 없다.

 

이제 이 파일들을 구조에 맞게 넣어줘야한다. 이걸 어떻게 해야하는지 몰라서 한참 찾았다.

https://github.com/Mendeley/breakpad

이 사람이 디렉토리 구조를 이미 만들어서 넣어놨길래 그대로 참고했다. (아마 이 사람은 브레이크패드에 맞도록 모든 라이브러리 파일을 다 넣어서 올려놓은듯하다. 이 소스를 받아다가 사용하면 잘될꺼 같기도하다.)

여기서부터 문제가 있는데, googlemock과 googletest 디렉토리를 구글브레이크패드 폴더에 복사해넣어줘야 한다. 그런데 내 경우에는, 회사컴퓨터에서 할 때와, 내 컴퓨터에서 했을 때 경로가 달랐다.

회사컴퓨터에서는… 구글 브레이크패드 디렉토리 중 src 디렉토리 밑에 testing 디렉토리를 만들고 거기에 googlemock 디렉토리 내용 전체를 복사해서 넣는다. 그리고 src/testing 디렉토리 밑에 gtest 디렉토리를 만들고 거기에는 googletest 디렉토리 내용 전체를 복사해서 넣는다.

집 컴퓨터에서는… 구글 브레이크 패드 디렉토리 중 src 디렉토리 밑에 testing 디렉토리를 만들고 거기에 googlemock과 googletest 디렉토리 두개를 그대로 복사해넣었다.

 

이제 구글 브레이크패드 솔루션 파일을 열고 build_all 프로젝트를 빌드해보면…

안된다.

 

오류가 난다. 오류내용은

C4091 'typedef ': 변수를 선언하지 않으면 '' 왼쪽은 무시됩니다.
C2220 경고가 오류로 처리되어 생성된 'object' 파일이 없습니다.

해당 코드는 다음과 같이 되어있다.

typedef enum {
    hdBase = 0, // root directory for dbghelp
    hdSym,      // where symbols are stored
    hdSrc,      // where source is stored
    hdMax       // end marker
};

enum인데 이름이 정의되지 않은 상태로 typedef가 되었기 때문에 나는 에러이다.

이걸 검색해보니 다음과 같은 내용을 찾았다.

https://stackoverflow.com/questions/913344/how-can-i-remove-the-vs-warning-c4091-typedef-ignored-on-left-of-spreadsh

typedef를 그냥 삭제해버리랜다. 삭제하려고 봤더니…

이 오류가 나는건, C:\Program Files (x86)\Windows Kits\8.1\Include\um\DbgHelp.h 파일이었다. C++ 라이브러리를 수정할 수는 없는 노릇… ‘프로젝트 속성’의 ‘구성 속성’ -> ‘C/C++’ -> ‘고급’을 찾아가 ‘특정 경고 사용 안 함’ 에 4091을 추가했다. 이제 빌드가 된다.

같은 에러가 나는 프로젝트를 찾아서 전부 위처럼 4091 에러에 대한 경고무시를 설정해줘야한다.

이렇게 또 build_all 을 해봤더니 또 오류가 난다.

프로젝트 중 unittests 에 있는 processor_bits 프로젝트가 계속 에러가 나는 것이었다. 경고를 전부 오류 처리해버리기에 빌드가 되지 않았다. 이것도 4091 에러처럼 4267, 4366 을 경고무시에 추가한다.

이제 다시 build_all 프로젝트를 빌드해본다.

또 오류가 난다.

unittest 에 있는 client_tests 프로젝트에서 에러가 났다. 마찬가지로 경고를 오류로 처리해서 나는 에러. 4389, 4312, 4267 을 경고무시로 넣어준다.

다시 build_all 프로젝트를 빌드해본다.

드디어 아무 에러 없이 성공.

이제 빌드된 구글브레이크패드를 이용해서 실제 사용하는 방법을 찾아봐야겠다.

Lightsail 을 사용한 이후 그동안의 업데이트와 변화

AWS를 사용하기 시작한지도 꽤 된 것 같다. 이 서비스가 나온지 얼마 안되서부터 사용하기 시작했고 아쉬운 점이 많았는데 최근에 몇가지 기능들이 추가되었다.

 

리전간 스냅샷 복사 기능 추가

오늘 알게된 내용인데 리전간 스냅샷 복사 기능이 드디어 추가되었다.

일본 리전에서 인스턴스를 만들어 쓰다가 몇달전 서울 리전으로 이동하려고 했을 때, 이 스냅샷 복사 기능이 아직 구현되어 있지 않았었다. 그래서 서울 리전에 인스턴스를 새로 만들어서 데이터를 수동으로 옮겼다. 그때 이 기능이 없어서 아쉬웠는데 이제서야 생겼네.

스냅샷을 생성한 후 메뉴를 보면 다른 리전에 복사라는 메뉴가 생겼다. 그러고보니 Amazon EC2로 내보내기라는 메뉴도 생겼다…? 라이트세일에서 운영하던 인스턴스를 그대로 EC2로 가져갈 수 있다는 의미인건가…!?

스냅샷 복사를 선택하면 리전은 어디로도 이동가능하다.

 

데이터베이스 기능 추가

데이터베이스를 별도의 인스턴스로 추가시켜주는 기능이다. 내가 라이트세일을 처음 이용할 때는 이런 기능이 없었는데 얼마전 추가되었다. 사실 라이트세일을 이용하는 유저라면 기본적으로 자기 서버에 데이터베이스를 설치해서 쓸줄 알것이라 생각되므로 이런 기능이 굳이 필요한지는 잘 모르겠다.

현재는 MySQL만 지원한다.

가격은 월 15달러.

고가용성 옵션도 있는데 가격은 두배!

 

태그 기능 추가

어떤 인스턴스가 어떤 서비스를 담당하고 있는지 태그 기능으로 묶을 수 있다.

https://aws.amazon.com/ko/about-aws/whats-new/2018/11/amazon-lightsail-now-supports-resource-tagging/

 

EC2 업그레이드

lightsail에서 사용하던 인스턴스를 그대로 EC2로 가지고 갈 수 있다. 서비스가 크게 늘어나거나 하면 EC2로 가져갈 수 있게 만들어준듯. 한편으로는 라이트세일이 미끼용이기도하고. ㅎㅎ

https://aws.amazon.com/ko/about-aws/whats-new/2018/11/amazon-lightsail-now-provides-an-upgrade-path-to-ec2/

C++에서 엑셀파일 처리하기

C++에서 엑셀파일을 다루는 법을 찾아보았다.

2012년도에 엑셀 파일을 처리할 방법을 찾다가 https://blog.dongbumkim.com/archives/754 이런 글을 썼었는데 이제는 그보다 더 나은 방법을 찾을 수 있었다.

예전에 작업하던 소스에서는 ODBC를 이용하여 연결했었는데 왠일인지 이 방법으로는 제대로 연결되지 않았다. 당시에는 잘 작동하던 소스였는데…

찾아보니 윈도우 버전이 올라가며 제대로 작동하지 않는듯하다.(확실히 끝까지 찾아보지는 못했다.) ADO 등의 다른 방법으로 연결하는 것을 안내하고 있었다.

웹서핑을 하며 엑셀 파일을 다룰 수 있는 라이브러리를 찾아보다가 스택오버플로우에서 xlnt 라는 라이브러리를 추천해줘서 한번 테스트해보았다.

https://github.com/tfussell/xlnt

무려 크로스플랫폼의 C++14에 맞춘 xlsx 파일 처리 가능한 라이브러리라고 설명이 되어있다.

처음에는 잘 작동하는듯했으나… 오 잘되네 하고 본격적인 테스트코드를 만들다보니 버그가 있었다. 시트를 하나 더 추가해서 2개의 시트를 만들고 컬럼을 추가하면 에러가 떴다. 엑셀 파일을 아무리 봐도 문제가 없어 검색해봤더니 이미 버그리포팅이 되어있던 이슈. 나도 가서 한마디 거들었다.

https://github.com/tfussell/xlnt/issues/330#issuecomment-440589168

xlnt로 하루 넘는 시간을 날리고 다시 검색해보니 ExcelFormat 라이브러리를 추천했다. 이것으로 작업을 성공적으로 했다는 댓글도 있어서 이걸로 결정.

https://www.codeproject.com/Articles/42504/ExcelFormat-Library

사용해보니 다른 외부 컴포넌트 없이 바로 사용 가능했다.

단점은,

  • xlsx는 지원하지 않고 xls 파일만 지원한다.
  • 데이터를 가져올 각 셀마다 데이터타입을 정확하게 지정해줘야한다.
  • 그런데 숫자만 들어있는 셀은 전부다 double 형으로 데이터를 가져온다. int로 캐스팅해야함.
    for (int k = 0; k < sheet->GetTotalRows(); ++k)
    {
        for (int j = 0; j < sheet->GetTotalCols(); ++j)
        {
            ExcelFormat::BasicExcelCell* cell = sheet->Cell(k, j);
            switch (cell->Type())
            {
            case ExcelFormat::BasicExcelCell::INT:
                std::cout << "INT:" << cell->GetInteger() << std::endl;
                break;
            case ExcelFormat::BasicExcelCell::DOUBLE:
                std::cout << "DOUBLE:" << static_cast<int>(cell->GetDouble()) << std::endl;
                break;
            case ExcelFormat::BasicExcelCell::STRING:
                std::cout << "STRING:" << cell->GetString() << std::endl;
                break;
            case ExcelFormat::BasicExcelCell::WSTRING:
                std::cout << "WSTRING:" << cell->GetWString() << std::endl;
                break;
            case ExcelFormat::BasicExcelCell::UNDEFINED:
            case ExcelFormat::BasicExcelCell::FORMULA:
            default:
                break;
            }
        }
    }
  • 암호 걸린 엑셀파일은 처리 불가능하다.

테스트 코드를 열심히 작성해봤더니 시트가 여러개일때도, 데이터가 꽤 많을 때에도 데이터 처리가 무난했다.

사용했던 테스트 코드의 일부.

class DataTableMgr
{
private:
	ExcelFormat::BasicExcel xls;
};

bool DataTableMgr::LoadWeaponBombTable(void)
{
    ExcelFormat::BasicExcelWorksheet* sheet = nullptr;
    
    for (int i = 0; i < xls.GetTotalWorkSheets(); ++i)
    {
        sheet = xls.GetWorksheet(i);
        if (nullptr == sheet)
            continue;

        if (!strcmp(WEAPONBOM_SHEETNAME, sheet->GetAnsiSheetName()))
        {
            sheet = xls.GetWorksheet(i);
            break;
        }
    }

    if (nullptr == sheet)
        return false;

    // 첫행은 컬럼 인덱스이므로 항상 패쓰
    for (int i = 1; i < sheet->GetTotalRows(); ++i)
    {
        DATATABLE_WEAPONBOMB weapon_bomb;
        weapon_bomb.index = static_cast<int>(sheet->Cell(i, 0)->GetDouble());
        weapon_bomb.id = static_cast<int>(sheet->Cell(i, 1)->GetDouble());
        weapon_bomb.id_5pack = static_cast<int>(sheet->Cell(i, 2)->GetDouble());
        weapon_bomb.id_11pack = static_cast<int>(sheet->Cell(i, 3)->GetDouble());
        weapon_bomb.itemid = static_cast<int>(sheet->Cell(i, 4)->GetDouble());

        weapon_bomb_map.insert(DATATABLE_WEAPONBOMB_MAP::value_type(weapon_bomb.index, weapon_bomb));
    }

    std::cout << "WeaponBomb count : " << weapon_bomb_map.size() << std::endl;

    return true;
}

코드 자체는 잘 작동했지만, static 데이터를 엑셀 파일로 관리하는 것에 대해 위험함이 제기 되어 이 프로젝트는 무산되었다. ㅎㅎㅎ 나중에 언젠가는 쓸 일이 있겠지.

DROWN Attack 취약점 방지용 SSL 설정

https://www.ssllabs.com 에서 SSL 테스트를 해봤는데 DROWN 취약점이 있다고 F 등급을 먹인다.

DROWN 공격 취약점에 대한 내용

줄여서 얘기하자면, SSL v1, v2, v3와 TLS 1.0은 사용하지 않도록 하는 것이 목표이다.

그렇게 설정했는데도 아무리해도 되질 않았다.

에서 답을 찾았다. default_server 설정이 있어야 한다는 것.

nginx virtualhost 설정에서

server {
        listen                  443 ssl default_server;
        root                    /opt/bitnami/apps/blog.dongbumkim.com/htdocs/;
        server_name             blog.dongbumkim.com;
        ssl_certificate         /etc/letsencrypt/live/blog.dongbumkim.com/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/blog.dongbumkim.com/privkey.pem;
        include                 "/opt/bitnami/nginx/conf/ssl_param.conf";
        include                 "/opt/bitnami/apps/blog.dongbumkim.com/conf/nginx-app.conf";
}

default_server 를 꼭 넣어줘야한다.

이 default_server 설정은 하나만 있어야하므로 여러 가상호스트를 쓰고 있다면 그 중 한 곳의 server 블록에만 넣어줘야한다. 만약 여러곳에 넣으면 nginx 실행시 에러난다.

SSL 설정은 다음 사이트에서도 만들 수 있다.

 

yum에서 특정패키지 제외하고 업데이트하는 방법

지금 운영하는 서버에는 데디케이트 서버 라이브러리를 제작해준 회사에서 제공한 패키지가 같이 설치되어 있다.

이 파일이 따로 RPM 파이롤 제공되었기 때문에 yum localinstall 로 설치하게 되었는데, 문제는 yum update 를 하게 되면 이 패키지까지 같이 업데이트를 하려고 시도를 하게 된다.

이 패키지는 강제설치된 것이어서 의존성 문제가 엄청나게 발생하고 결국에는 yum update 는 실패하게 된다.

그래서 매번 yum update 를 할때마다 이 패키지만 제외한 채로 하나씩 업데이트를 해왔는데 아예 이 패키지를 제외하고 업데이트를 간편하게 하는 방법이 있었다.

원본 출처 : https://access.redhat.com/solutions/10185

yum update 시에

yum update --exclude=PACKAGENAME

을 이용해 특정패키지를 제외하고 나머지 패키지를 전체 업데이트 할 수 있다.

 

하지만 매번 명령어를 저렇게 입력해야하는지라, 아예 저 명령조차 입력하고 싶지 않다면,

/etc/yum.conf 파일에 다음처럼 입력한다.

[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exclude=kernel* redhat-release*                           <====

 

이렇게 추가하고 나면 이후에는 아예 yum update 시에 이 패키지를 제외하게 된다.

Node.js MaxListener 에러 수정

웹소켓 테스트 중 마주친 에러.

대략 코드상으로는 별 문제가 없는데 실행시 이러한 에러가 나왔다.

(node:5828) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 close listeners added. Use emitter.setMaxListeners() to increase limit

해결방법은

를 참고하여 해결.

코드 중간에 다음과 같은 코드를 삽입한다.

require('events').EventEmitter.prototype._maxListeners = 100;

그런데 이 코드를 넣으면 이벤트 전반에 대한 리스너 갯수를 변경하는지라… 글로벌하게 변경해도 되나 모르겠네. 웹소켓 객체에다가만 적용하는 방법을 더 찾아봐야할 것 같다.

Lightsail 에서 NGINX에 SSL 적용하기 (2)

제대로 접속이 된다면 Lightsail 관리자페이지에서 HTTPS 접속을 위한 환경을 추가한다. ssl.83rpm.com 도메인을 추가한 다음, 443 포트를 연다.

이제 SSL 설정을 시작한다.

내가 수정해야될 사이트의 가상호스트 설정 파일을 연다. 내 경우에는, /opt/bitnami/apps/ssl.83rpm.com/conf/nginx-vhost.conf 파일.

기존의 파일 내용은 다음과 같다.

server {
        listen          80;
        root            /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name     ssl.83rpm.com;
        client_max_body_size    40M;
        include         "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

이 파일 내용을 다음과 같이 변경한다.

server {
        listen          80;
        root            /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name     ssl.83rpm.com;
        client_max_body_size    40M;
        include         "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

server {
        listen                  443 ssl;
        root                    /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name             ssl.83rpm.com;
        ssl_certificate         /opt/bitnami/nginx/ssl/server.crt;
        ssl_certificate_key     /opt/bitnami/nginx/ssl/server.key;
        ssl_session_cache       shared:SSL:1m;
        ssl_session_timeout     5m;
        ssl_ciphers             HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        include                 "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

수정이 완료되었다면 lightsail 재시작 명령어로 모두 재시작한다.

sudo /opt/bitnami/ctlscript.sh restart

재시작하고 난 뒤 웹브라우저를 열고 https://ssl.83rpm.com 으로 접속이 잘 되는지 확인해본다.

구글 크롬과 인터넷 익스플로러의 경우 다음과 같이 표시된다.

내가 임의로 생성한 인증서이므로 안전하지 않기에 경고가 표시되지만 경고를 무시하면 어찌됐든 잘 표시된다.

만약, HTTP로 접속하더래도 무조건 HTTPS로 강제로 접속시키고 싶다면, nginx-vhost.conf 파일을 열고 다음과 같은 설정을 추가한다.

server {
        listen          80;
        root            /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name     ssl.83rpm.com;
        client_max_body_size    40M;
        include         "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
        rewrite ^ https://$server_name:443?request_uri? permanent;
}

server {
        listen                  443 ssl;
        root                    /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name             ssl.83rpm.com;
        ssl_certificate         /opt/bitnami/nginx/ssl/server.crt;
        ssl_certificate_key     /opt/bitnami/nginx/ssl/server.key;
        ssl_session_cache       shared:SSL:1m;
        ssl_session_timeout     5m;
        ssl_ciphers             HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        include                 "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

엔진엑스를 재실행하면 이제부터는 http로 접속하더라도 https 로 자동전환된다.

테스트하려면 http://ssl.83rpm.com 혹은 https://ssl.83rpm.com 으로 접속해보시길. (언제 닫을지는 모릅니다.)

참고자료