Yuk install LEMP stack paling mutakhir!

Orang kalau mendengarkan sebuah VPS disetting memakai stack LEMP/LNMP (Linux, Nginx, MySQL, PHP) biasanya masih menggunakan yang standar versinya dan mencari tutorialnya sendiri sangatlah mudah di internet. Tapi kemarin ada request dari mbak Shafira bagaimana cara install semua software diatas yang versi terbarunya di CentOS:

  • Nginx 1.9.9
  • MariaDB 10.1 – Ini fork dari MySQL, jadi masih kompatibel.
  • PHP 7.0 – Ini versi terbaru PHP dan masih belum standar.
  • Memcached
  • phpMyAdmin

Benar – benar bleeding edge versi yang digunakan, karena saya sendiri sampai rasanya berdarah – darah menguji coba dan menuliskan tutorialnya. Haha. πŸ˜€

Sedikit penjelasan dulu, kalau anda mengikuti panduan instalasi Nginx, PHP dan MariaDB berikut ini maka akan mendapatkan versi paling mutakhirnya baik sudah stabil atau belum. Bisa jadi yang anda install nanti malah lebih baru versinya daripada yang saya coba sekarang. Tidak standar soalnya. Tapi aman kok, karena semuanya melalui repository jadi masih bisa diupdate ke versi barunya. Tidak compile dari source atau metode – metode aneh lainnya yang akan merepotkan kedepannya.

Semua langkah – langkah dibawah dengan asumsi menggunakan CentOS 6.7 32-bit, untuk versi lainnya bisa anda cari sendiri perintah alternatifnya atau tanyakan di komentar.

Langkah 1: Install Nginx Mainline

Sebelumnya mari kita update dulu seluruh paket aplikasi yang terdapat dalam CentOS, ini wajib buat saya:

yum update

Kemudian kita tambahkan repository CentOS untuk Nginx versi 1.9.9 – termasuk edisi mainline versi ini, kalau anda cuma install menggunakan repository EPEL atau REMI hanya akan muncul yang stable dan saat ini masih di 1.8.0.

Ketikkan perintah ini:

nano /etc/yum.repos.d/nginx.repo

Didalamnya tambahkan kode berikut

[nginx]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Sudah, lanjutkan dengan instalasi Nginx:

yum install nginx

Setelahnya cek saja versi Nginx apa yang telah terpasang:

nginx -V

Informasinya akan mirip seperti ini:

nginx version: nginx/1.9.9
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables'

Yuk kita jalankan proses Nginx:

service nginx start

Dan kalau malah muncul pesan error:

Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
                                                           [FAILED]

Berarti sudah ada web server lain yang aktif di port 80, semestinya httpd (Apache) dan solusinya antara anda matikan:

service httpd stop

Atau dihapus:

yum remove httpd

Terserah anda pilih yang mana. Saran saya nonaktifkan saja, nanti anda tahu alasan saya pas install PHP 7.

Saya beri catatan dimana direktori default Nginx supaya tidak bingung mencarinya:

  • /usr/share/nginx/ – root directory, bisa anda tambahkan virtual host disini.
  • /etc/nginx/conf.d/default.conf – konfigurasi default dari virtual host.
  • /etc/nginx/conf.d – yang diatas copy-paste dan masukkan disini sesuai nama domainnya.
  • /etc/nginx/nginx.conf – konfigurasi default dari web server nginx.

Akhirnya selesai untuk Nginx. πŸ˜€

Langkah 2: Install MariaDB 10.1

Instalasi MariaDB versi 10.1 malah yang paling mudah menurut saya, pertama kita tambahkan repositorynya:

nano /etc/yum.repos.d/MariaDB.repo

Isikan kode berikut didalamnya:

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos6-x86
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Ingat ini untuk CentOS 6 32-bit ya.

Selanjutnya tinggal install saja:

yum install MariaDB-server

Dan jalankan prosesnya:

service mysql start

Benar – benar gampang dan cepat kan? Tidak ada password rootnya lho jadi ketik perintah mysql akan langsung masuk ke databasenya, perlu anda amankan dulu saran saya.

Langkah 3: Install PHP 7

Install PHP versi 7 ini yang membuat saya kurang tidur. Awalnya sudah sulit sekali menemukan mana ini repository yang tepat. Walaupun banyak di internet menuliskan repository Remi atau Webtatic tapi masih menggunakan nama paket aplikasi lama: php70. Ternyata sudah berubah karena PHP 7 sudah masuk status release, jadi ikut penamaan standar PHP yang biasanya. F***! Agak emosi jadinya gagal terus. Haha. πŸ˜€

Seperti biasa kita tambahkan repository syaratnya, yakni EPEL dan Remi:

yum install epel-release
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm 
rpm -Uvh remi-release-6*.rpm

Baru kita install PHP 7, bisa anda perhatikan ada repository Remi khusus untuk PHP 7.0:

yum --enablerepo=remi-php70 install php php-fpm php-opcache php-bcmath php-cli php-gd php-mbstring php-mcrypt php-mysql php-mysqlnd php-odbc php-pdo php-pdo_dblib php-pear php-pecl-xdebug php-process php-pspell php-recode php-xml php-xmlrpc

Momen WTF saya pas lihat httpd kok ikut diinstall lagi sebagai dependensinya. Haha. Padahal niatnya murni Nginx. Nah ini alasan saya agar dimatikan saja, ganti portnya atau mungkin Nginx yang dijadikan reverse proxy, kalau dihapus nanti lenyap juga instalasi PHPnya. Oh ya, mungkin modul – modul PHP yang saya ikut sertakan diatas terlalu banyak.

Segera saja dicek apakah benar sudah terinstall:

php -v

Hasilnya akan muncul pesan seperti berikut:

PHP 7.0.2 (cli) (built: Jan  6 2016 14:53:11) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.4.0RC3, Copyright (c) 2002-2015, by Derick Rethans

Yes! πŸ˜€

Mari kita jalankan proses PHP FastCGI Process Manager atau biasanya disebut PHP-FPM:

service php-fpm start

Akan aktif di localhost dengan port 9000.

Langkah 4: Menyambungkan Nginx 1.9.9 dengan PHP 7.0.2 lewat FastCGI

Ini adalah bos terakhir dalam petualangan kita, dan paling sulit ternyata. Mungkin karena ngantuk atau sudah lupa beberapa mantra untuk menjamin kelanggengan om Nginx dan tante PHP. πŸ™‚

Pertama edit dulu setting PHP:

nano /etc/php.ini

Cari kode dibawah, hilangkah komentarnya dan ganti nilainya dari 1 menjadi 0:

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0

Selanjutnya mari kita instruksikan Nginx lewat setting virtual host default bahwa script PHP bisa dieksekusi:

nano /etc/nginx/conf.d/default.conf

Didalamnya anda akan menemukan kode serupa:

location / {
        root   /usr/share/nginx/html;
        index index.php index.html index.htm;
    }

Tambahkan index.php diawalnya sesuai potongan kode diatas.

Ini belum selesai editnya dan geser kebawah sampai menemukan bagian location mirip dibawah, sekarang kita akan menyambungkan Nginx dengan PHP-FPM:

location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

Saya terbentur beberapa lama di kode diatas karena walaupun ada file php dan saya coba akses kok malah error. Akhirnya ketemu yang tepat.

Akhirnya kita setting agar PHP-FPM menggunakan Nginx:

nano /etc/php-fpm.d/www.conf

Ubah dari sebelumnya apache menjadi nginx untuk user dan groupnya:

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

Kemudian mari kita restart Nginx dan PHP-FPM setelah semua settingnya dimodifikasi:

service nginx restart
service php-fpm restart

Selesai!

Langkah 5: Uji coba PHP bisa dijalankan oleh Nginx

Ini langkah mudah sebenarnya, pertama kita buat dulu file PHPnya:

nano /usr/share/nginx/html/phpinfo.php

Ingat, saya masih menggunakan default dari direktori Nginx. Silahkan anda sesuaikan sendiri kalau sudah menggunakan virtual host/nama domain.

Kemudian isikan kode berikut:

<?php
// Tampilkan informasi instalasi PHP pada server
phpinfo();
?>

Setelah itu buka file php diatas lewat browser, bisa lewat alamat IP server atau nama domainnya. Kalau semuanya berjalan lancar akan muncul seperti ini halamannya:
Nginx PHP 7 phpinfo

Selamat! Anda sudah berhasil menginstall LEMP stack yang benar – benar terbaru. Untuk proses menambahkan website dan sebagainya sama seperti biasanya.

Sekarang tinggal menambahkan agar layanan (daemon) nginx dan php-fpm ini selalu dijalankan saat server hidup/reboot:

chkconfig nginx on
chkconfig php-fpm on
chkconfig mysql on

Selesai sudah petualangan kita. πŸ˜€

Penutup

Ternyata tidak semudah yang saya kira kalau mau install dari awal. Haha. πŸ˜€ Sebelumnya saya cuma coba upgrade PHP 5.6 ke PHP 7.0 jadi semua settingnya masih memanfaatkan yang lama, tidak seperti yang saya bahas karena benar – benar dari nol.

Untuk Memcached sendiri saya masih belum mencoba karena memang belum kompatibel, jadi nanti akan menyusul. Tapi PHP OPcache sudah siap dan telah saya ikutkan dalam modul PHP yang diinstall diatas. Sedangkan phpMyAdmin saya coba tidak ada bedanya dengan cara yang biasa, tinggal diletakkan pada direktori root atau virtual hosting Nginx dan akses seperti biasanya saja.

Semoga bermanfaat. πŸ™‚

*Ini tidak penting sih, saya kesulitan mencari judul yang tepat karena ini bukan menginstall LEMP stack yang biasanya. Semoga cocok yang saya pilih. Hehe. πŸ™‚

29 thoughts on “Yuk install LEMP stack paling mutakhir!

  1. terima kasih banyak mas chandra dan maaf sudah menggangu jam istirahatnya πŸ˜€
    jadinya nggak perlu aktifkan dulu repo remi dan phpnya di file /etc/yum.repos.d/remi.repo ya langsung eksekusi langsung perintah instal phpnya.
    saya coba dulu mas πŸ™‚

    • Haha, ga masalah kok mbak. Agak menantang soalnya. Pikir saya sekalian belajar lagi. Enak (atau ga enaknya?) belajar server ini sekali berhasil jarang sekali masalah, jadi hal – hal baru seperti PHP 7.0 ini kalau tidak ada kasus atau kebutuhan ya kapan – kapan saja nyobanya. πŸ™‚

      Saya terlalu meremehkan juga sih, dipikir sama kaya biasanya. Hasil di Google sendiri kurang pas, rata – rata cuma install PHP 7.0 saja dan masih memanfaatkan repository lama atau sudah tidak valid lagi. #curhat

  2. sudah coba dan berhasil trims mas chandra πŸ™‚
    mungkin tambahan bisa ditambahkan perintah :

    chkconfig nginx on
    chkconfig php-fpm on
    chkconfig mysql on

    biar otomatis berjalan saat vps direstart

    saya coba juga dengan cara lain mungkin sama saja sebenarnya untuk instal php7 (maunya agar remi repo selalu aktif):

    yum install epel-release -y
    rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
    vi /etc/yum.repos.d/remi.repo
    [remi]
    name=Les RPM de remi pour Enterprise Linux 6 - $basearch
    #baseurl=http://rpms.famillecollet.com/enterprise/6/remi/$basearch/
    mirrorlist=http://rpms.famillecollet.com/enterprise/6/remi/mirror
    enabled=1
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
    yum install yum-utils -y
    yum-config-manager --enable remi-php70
    yum install php-fpm php-gd php-mysqlnd php-xml php-mcrypt php-mbstring php-opcache -y

    untuk menyambung nginx dengan php saya gunakan perintah ini :

    sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php.ini

    dan uji coba phpnya bisa menggunakan perintah ini:

    echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/info.php

    dan….saya coba instal memcached dan ekstesinya seperti tutor mas chandra sebelumnya berhasil! jalan dengan baik πŸ™‚ tapi nanti lihat2 lagi gimana perkembangannya πŸ˜€ performanya memang mantap pakai php7.
    oh ya tambahan cara diatas dengan centos 6.7 versi minimalis di xvmlabs jadi selama proses untuk apache nggak ikut ke install πŸ™‚

    • Loh iya mbak, kelupaan chkconfignya. Haha. πŸ˜€ Gini ini kalau sudah kebiasaan jadi tidak dicatat, langsung reflek saja edit – editnya. πŸ˜› Terimakasih sudah saya koreksi, sekalian nambahin kalau PHP-FPM pakai user dan grup nginx untuk daemonnya. Lupa juga ternyata.

      Kalau ga dikomentari proses instalasinya ternyata cuma beberapa baris ya. Hehe. πŸ˜€ Iya mbak, kurang lebih sama saja maksudnya. Enaknya di Linux banyak jalan menuju Roma. πŸ™‚ Bisa banyak variasinya, tingga pilih mana yang menurut kita paling mudah dipahami.

      Soal memcached memang bisa diinstall mbak, tapi yang saya maksudnya itu belum kompatibelnya modul php-memcached jadi PHPnya sendiri yang belum bisa memanfaatkan. Bisa dicek di GitHubnya bagian Issues: https://github.com/php-memcached-dev/php-memcached/issues ada beberapa yang masih membahas PHP 7.0 dan belum fix.

      Tapi ini di CentOS saja tampaknya, dan ternyata di Debian sudah ada yang membuatkannya lengkap: https://github.com/kasparsd/php-7-debian . Ilmu saya belum sesakti ini. πŸ™

  3. Sempat nyoba pake PHP 7.0 di Centos6 dan performanya sekilas memang responsif mas tapi pas benchmark php dengan konfigurasi yang sama diatas kok hasilnya jelek ya. Agak bingung juga dengan hasil benchmark tapi blog WP rasanya lebih responsif.
    --------------------------------------
    | PHP BENCHMARK SCRIPT |
    --------------------------------------
    Start : 2016-02-23 06:19:48
    Server : 128.x.x.x
    PHP version : 7.0.3
    Platform : Linux
    --------------------------------------
    test_ifelse : 4.766 sec.
    test_loops : 6.872 sec.
    test_stringmanipulation : 3.239 sec.
    test_math : 2.890 sec.
    --------------------------------------
    Total time: : 17.767 sec.

    Request install HHVM+nginx+MariaDB on Centos6 donk mas Chandra πŸ˜€ Rasa-rasanya liat benchmark HHVM di blog luar bagus juga.

    • Benchmark PHPnya jangan dijadikan patokan juga sih mas, soalnya itu berdasarkan PHP 5 bukan PHP 7. Saya yakin tidak memanfaatkan fitur – fitur terbaru dari PHP 7 soalnya. Nanti saya coba cari tahu apa yang paling akurat untuk benchmark PHP.

      Oke mas, tapi HHVM resminya cuma ada di Ubuntu dan Debian mas. Jadi saya nanti rencananya menggunakan Debian 8 untuk testingnya.

  4. Ohh begitu, iya juga si saya juga sedikit bingung dengan hasil benchmark tadi soalnya blog WP benar-benar terasa lebih responsif dari sebelumnya. Siap mas, ditunggu πŸ˜€

    Makasih mas Chandra, saya tunggu info selanjutnya. Semoga HHVM sama php 7.0 performanya bisa diadu. hehe

    • Nah… menurut catatannya sih:
      This extension uses libmemcached library to provide API for communicating
      with memcached servers.

      memcached is a high-performance, distributed memory object caching system,
      generic in nature, but intended for use in speeding up dynamic web
      applications by alleviating database load.

      It also provides a session handler (memcached).

      Package built for PHP 7.0.
      Mestinya iya? Tapi saya belum tes mbak.

      Lanjut cek ke Github secara resmi belum ada rilisnya, masih ada masalah: https://github.com/php-memcached-dev/php-memcached/issues/213

  5. Sudah berhasil mas tadi saya instal ulang menggunakan repo ius, nanti kalau ada kesulitan saya kesini lagi, terimakasih.

      • Loh WordPress setahu saya sudah kompatibel PHP 7.0 mas, yang 7.1 mungkin juga. Masalahnya bukan WordPressnya, tapi plugin dan theme yang belum tentu support.

      • nah itu mas hehe, berarti mainnya yang 7.0 aja yah? daripada 7.1 bisa berbahaya buat situs kita hehe.
        thanks mas chandra πŸ˜€

      • Mungkin suatu saat saya coba migrasi dari PHP 5.6 ke 7.0 dulu mas. Kebetulan blog ini minim pluginnya. πŸ˜€ Tampaknya lebih aman.

        Bakal lebih asyik lagi kalau install sebelahan antara 5.6 dan 7.0/7.1, tinggal ganti mau pakai mesin PHP-FPM yang mana saja. Mestinya bisa sih.

      • lha di EE udah ada dual PHP mas yang jalan, yaitu PHP v5.6 dan juga PHP 7 tergantung kita memilih saat instalasinya seperti tutorial sampean itu lhoo :D.
        jadi bener2 2 PHP FPM berjalan bersandingan :).

        http://prnt.sc/dsvcs4

        maka dari itu saya doyan ama EE selain ringan juga gak ribet instalasi dll. lebih mudah daripada install LEMP manual πŸ™‚ #CMIIW

      • Haha, saya cuma pakai satu VPS yang ada EEnya mas. Maksud saya yang instalasi manual stack LEMPnya.

        Tapi kalau buat test drive tukar 5.6 ke 7.0 kayanya lebih mudah dan cepat pakai EE ini ya.

Leave a Comment