Newer
Older
Reverse-Proxy-Nginx-Multiple-Node / README.md
Reverse-Proxy-Nginx-Multiple-Node
===============
Dokumentasi untuk Lab Reverse Proxy Nginx with Multiple Node

<img src="https://git.leon36.web.id/yukitoki/Reverse-Proxy-with-Nginx/raw/master/images/nginx-reverse-proxy.jpg" width="650">

Task
==============
Instalasi & Konfigurasi:
*  Apache (Port 8080) node2
*  Nginx as Reverse Proxy (Port 80) node1
*  MariaDB 10.1 node3
*  PHP node2

Ketentuan:
* WordPress: wordpress.domain.tld (PHP 7.2, Port 8080 + Reverse Proxy) dengan Document Root di /home/wordpress/
* PrestaShop: prestashop.domain.tld (PHP 7.1, Port 8080 + Reverse Proxy) dengan Document Root di /home/prestashop/
* Nextcloud: nextcloud.domain.tld (PHP 7.3, Port 8080 + Reverse Proxy) dengan Document Root di /home/nextcloud/
* Phpmyadmin: console-sql.task.my.id (PHP 7.1, Port 8080 + Reverse Proxy) dengan Document Root di /home/phpmyadmin/


* Semua website harus menggunakan SSL
* SSL tidak boleh menggunakan CloudFlare ataupun CertBot
* SSL yang boleh digunakan adalah https://sslforfree.com

Installasi dan konfigurasi MariaDB pada node3
===============
Tambahkan repo mariadb
```
# vim /etc/yum.repos.d/mariadb.repo
```
```
# MariaDB 10.1 CentOS repository
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```
Simpan dan keluar, selanjut nya install mariadb
```
# yum -y install mariadb-server
```
Start dan enable MariaDB
```
# systemctl start mariadb
# systemctl enable mariadb
```
Kemudian setup MariaDB
```
# mysql_secure_installation
```
```
* Enter current password for root (enter for none): Just press the Enter
* Set root password? [Y/n]: Y
* New password: Enter password
* Re-enter new password: Repeat password
* Remove anonymous users? [Y/n]: Y
* Disallow root login remotely? [Y/n]: Y
* Remove test database and access to it? [Y/n]:  Y
* Reload privilege tables now? [Y/n]:  Y
```

Selanjutnya kita akan mengubah listen mariadb menjadi hanya listen pada ip private, agar database kita tidak bisa diakses dai luar

Cek ip terlebih dahulu
```
# ifconfig
```
Output:
```
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1460
        inet 10.148.0.14  netmask 255.255.255.255  broadcast 10.148.0.9
        inet6 fe80::4001:aff:fe94:9  prefixlen 64  scopeid 0x20<link>
        ether 42:01:0a:94:00:09  txqueuelen 1000  (Ethernet)
        RX packets 14403  bytes 125867464 (120.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11783  bytes 1123006 (1.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```
Nah pada bagian inet tertera ip kita, silakan copy ip nya

kemudian buka konfigurasi mariadb server
```
# vim /etc/my.cnf.d/server.cnf
```

<img src="https://s3-id-jkt-1.kilatstorage.id/joyfloss/2020/03/db-ss1.png" width="650">

Selanjutnya buat user dan database untuk masing-masing CMS dan phpmyadmin
```
# mysql -u root -p
```
#### 1. Prestashop
```
CREATE DATABASE prestashop;
GRANT ALL PRIVILEGES ON prestashop.* TO 'prestashopuser'@'10.148.0.15' IDENTIFIED BY 'prestashoppass';
```
#### 2. Nextcloud
```
CREATE DATABASE nextcloud;
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'10.148.0.15' IDENTIFIED BY 'nextcloudpass' WITH GRANT OPTION;
```
#### 3. Wordpress
```
CREATE DATABASE wordpress;
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'10.148.0.15' IDENTIFIED BY 'wordpresspass' WITH GRANT OPTION;
```
#### 4. Phpmyadmin
```
CREATE USER 'admin'@'10.148.0.15' IDENTIFIED BY 'password_here';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'10.148.0.15' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
```

Konfigurasi apache dan php pada node2
=============
Tambahkan user baru
```
# useradd wordpress
# useradd prestashop
# useradd nextcloud
# useradd phpmyadmin
```
Kemudian tambahkan host untuk domain kita dengan listen ip private untuk mengarahkan request dari nginx nantinya
```
# vim /etc/hosts
```
<img src="https://git.leon36.web.id/yukitoki/Reverse-Proxy-with-Nginx/raw/master/images/ss-4.png" width="650">

Installasi dan konfigurasi tools yang dibutuhkan
===============
#### Step 1: Install dan konfigurasi apache2
```
# yum -y install httpd
```
Ubah agar apache listen pada ip private server dan pada port 8080

sama seperti pada node3 cek ip private nya dan copy
```
# vim /etc/httpd/conf/httpd.conf
```
<img src="https://s3-id-jkt-1.kilatstorage.id/joyfloss/2020/03/httpd-ss2-1.png" width="650">

Disini kita merubah listen menjadi ip private agar apache tidak bisa diakses dari luar, karena webserver 
dan reverse proxy dalam 1 jaringan local yang sama maka kita tidak perlu mengekspose server ke luar dengan ip public
tapi cukup dengan ip private yang hanya bisa diakses oleh reverse proxy

#### Step 2: Install dan konfigurasi php
Selanjutnya install php, karena disini kita akan menggunakan 3 php dengan versi berbeda sekaligus, maka kita
akan menggunakan php-fpm dan kita akan mengubah setiap port default ketiga php aga bisa berjalan secara bersamaan diwaktu yang sama

Install repositori php remi
```
# yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm -y
```
Lalu install php satu per satu

php 7.1
```
# yum install php71 php71-php-fpm php71-php-mysql php71-php-pdo php71-php-gd php71-php-mbstring php71-php-mcrypt php71-php-xml php71-php-zip php71-php-intl php71-php-process php71-php-apcu -y
```
php 7.2
```
# yum -y install php72 php72-php-fpm php72-php-pdo php72-php-mysqlnd php72-php-opcache php72-php-xml php72-php-gd php72-php-devel php72-php-mysql php72-php-intl php72-php-mbstring php72-php-bcmath php72-php-json php72-php-iconv php72-php-soap php72-php-zip php72-php-mcrypt
```
php 7.3
```
# yum -y install php73 php73-php-fpm php73-php-pdo php73-php-mysqlnd php73-php-opcache php73-php-xml php73-php-gd php73-php-devel php73-php-mysql php73-php-intl php73-php-mbstring php73-php-bcmath php73-php-json php73-php-iconv php73-php-soap php73-php-zip php73-php-mcrypt
```
Konfigurasi php71. , buka www.conf
```
# vim /etc/opt/remi/php71/php-fpm.d/www.conf
```
Lalu tambahkan user dan group prestashop setelah apache, disini kita membuat agar webserver dapat mengakses direktory user
```
; 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 user chosen to provide access to the same directories as httpd
user = apache
user = prestashop
; RPM: Keep a group allowed to write in log dir.
group = apache
group = prestashop
```
Kemudian ubah listen port :9000 menjadi :9071
```
; Note: This value is mandatory.
listen = 127.0.0.1:9071
```
Lakukan untuk kedua user lainnya juga, sesuaikan dengan task

* Tambahkan user wordpress dan phpmyadmin ke php 7.2 dan ubah port menjadi :9072
* Tambahkan user nextcloud ke php 7.3 dan ubah port menjadi :9073

Ubah kepemilikan directory session
```
# chown -R prestashop:prestashop /var/opt/remi/php71/lib/php/session/
# chown -R wordpress:wordpress /var/opt/remi/php72/lib/php/session/
# chown -R nextcloud:nextcloud /var/opt/remi/php73/lib/php/session/
```

Ubah settingan selinux dari enforcing menjadi permissive
```
# setenforce 0
```
Jalankan Service php
```
# systemctl start php71-php-fpm
# systemctl enable php71-php-fpm

# systemctl start php72-php-fpm
# systemctl enable php72-php-fpm

# systemctl start php73-php-fpm
# systemctl enable php73-php-fpm
```
#### Step 3: Konfigurasi apache2
Pertama kita harus mengubah userdir.conf agar apache dapat mengakses user direktory
```
# vim /etc/httpd/conf.d/userdir.conf
```
Ubah UserDir Disabled menjadi UserDir Enabled [nama user], jika lebih dari satu user maka tambahkan [nama user] 
setelah [nama user] sebelumnya. lihat gambar dibawah agar lebih jelas

<img src="https://s3-id-jkt-1.kilatstorage.id/joyfloss/2020/03/httpd-ss3.png" width="650">

Kemudian scrol kebawah, di bagian
```
<Directory "/home/*/public_html">
    AllowOverride FileInfo AuthConfig Limit Indexes
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require method GET POST OPTIONS
</Directory>
```
Hapus public_html, lihat gambar di bawah

<img src="https://git.leon36.web.id/yukitoki/Reverse-Proxy-with-Nginx/raw/master/images/ss-3.png" width="650">

Simpan dan keluar, lalu restart service apache
```
# systemctl restart httpd
```

Kemudian kita akan membuat virtualhost untuk masing-masing website

**1. Virtualhost untuk prestashop**
```
# vim /etc/httpd/conf.d/prestashop.conf
```
Kemudian isikan
```
<VirtualHost *:8080>
    ServerName prestashop.task.my.id
    ServerAdmin admin@task.my.id
    DocumentRoot /home/prestashop
    ErrorLog /home/prestashop/error.log
    CustomLog /home/prestashop/requests.log combined
      <FilesMatch \.php$>
         SetHandler "proxy:fcgi://127.0.0.1:9071"
      </FilesMatch>
      <Directory /home/prestashop>
        <IfModule mod_dir.c>
           DirectoryIndex index.php index.html index.htm
        </IfModule>
        AllowOverride all
        Order allow,deny
        Allow from all
      </Directory>
</VirtualHost>
```
Disini saya menggunakan domain prestashop.task.my.id untuk website prestashop nantinya, silakan ubah dengan 
domain kalian dan jangan lupa untuk menambahkan A record

Kemudian perhatikan SetHandler “proxy:fcgi://127.0.0.1:9071” , disini kita mengarahkan setiap pemrosesan php ke php7.1,
ingat tadi pada konfigurasi php7.1 kita mengubah listen port menjadi 9071

**2. Virtualhost untuk wordpress**
```
<VirtualHost *:8080>
    ServerName wordpress.task.my.id
    ServerAdmin admin@task.my.id
    DocumentRoot /home/wordpress
    ErrorLog /home/wordpress/error.log
    CustomLog /home/wordpress/requests.log combined
      <FilesMatch \.php$>
         SetHandler "proxy:fcgi://127.0.0.1:9072"
      </FilesMatch>
      <Directory /home/wordpress>
        <IfModule mod_dir.c>
           DirectoryIndex index.php index.html index.htm
        </IfModule>
        AllowOverride all
        Order allow,deny
        Allow from all
      </Directory>
</VirtualHost>
```
Disini kita sesuaikan juga user dan listen portnya menjadi :9072

**3. Virtualhost untuk nextcloud**
```
<VirtualHost *:8080>
    ServerName nextcloud.task.my.id
    ServerAdmin admin@task.my.id
    DocumentRoot /home/nextcloud
    ErrorLog /home/nextcloud/error.log
    CustomLog /home/nextcloud/requests.log combined
      <FilesMatch \.php$>
         SetHandler "proxy:fcgi://127.0.0.1:9073"
      </FilesMatch>
      <Directory /home/nextcloud>
        <IfModule mod_dir.c>
           DirectoryIndex index.php index.html index.htm
        </IfModule>
        AllowOverride all
        Order allow,deny
        Allow from all
      </Directory>
</VirtualHost>
```
**4. Virtualhost untuk phpmyadmin**
```
<VirtualHost *:8080>
    ServerName console-sql.task.my.id
    ServerAdmin admin@task.my.id
    DocumentRoot /home/phpmyadmin
    ErrorLog /home/phpmyadmin/error.log
    CustomLog /home/phpmyadmin/requests.log combined
      <FilesMatch \.php$>
         SetHandler "proxy:fcgi://127.0.0.1:9073"
      </FilesMatch>
      <Directory /home/phpmyadmin>
        <IfModule mod_dir.c>
           DirectoryIndex index.php index.html index.htm
        </IfModule>
        AllowOverride all
        Order allow,deny
        Allow from all
      </Directory>
</VirtualHost>
```
Jika sudah semua cek apakah ada konfigurasi yang salah
```
# httpd -t
```
Restart apache
```
# systemctl restart httpd
```

Selanjutnya lakukan pengecekan php menggunakan curl

Pertama buat file index.php di setiap dir root website
```
# echo "<?php phpinfo();" > /home/nextcloud/test.php
# echo "<?php phpinfo();" > /home/wordpress/test.php
# echo "<?php phpinfo();" > /home/prestashop/test.php
```
Selanjut nya ubah kepemilikan dan permission setiap dir root website
```
# chown -R nextcloud:nextcloud /home/nextcloud
# chmod -R 755 /home/nextcloud

# chown -R wordpress:wordpress /home/wordpress
# chmod -R 755 /home/wordpress

# chown -R prestashop:prestashop /home/prestashop
# chmod -R 755 /home/prestashop
```

Cek versi php dengan curl
Prestashop
```
# curl -I prestashop.task.my.id:8080/test.php
```
Output:
```
HTTP/1.1 200 OK
Date: Sun, 08 Mar 2020 07:27:22 GMT
Server: Apache/2.4.6 (CentOS)
X-Powered-By: PHP/7.1.33
Content-Type: text/html; charset=UTF-8
```

Wordpress
```
# curl -I wordpress.task.my.id:8080/test.php
```
Output:
```
HTTP/1.1 200 OK
Date: Sun, 08 Mar 2020 07:29:15 GMT
Server: Apache/2.4.6 (CentOS)
X-Powered-By: PHP/7.2.28
Content-Type: text/html; charset=UTF-8
```

Nextcloud
```
# curl -I nextcloud.task.my.id:8080/test.php
```
Output:
```
HTTP/1.1 200 OK
Date: Sun, 08 Mar 2020 07:30:08 GMT
Server: Apache/2.4.6 (CentOS)
X-Powered-By: PHP/7.3.15
Content-Type: text/html; charset=UTF-8
```
Perhatikan pada bagian X-Powered-By: PHP/ pastikan versi php nya sudah cocok dengan yang kita inginkan

Konfigurasi reverse proxy nginx pada node1
===============
Install dan enable nginx
```
# yum -y install nginx
```
Start dan enable nginx
```
# systemctl start nginx
# systemctl enable nginx
```
Buat server block yang akan di gunakan sebagai reverse proxy yang mengarah pada masing-masing website

**1. Prestashop**
```
# vim /etc/nginx/conf.d/prestashop.conf
```
Kemudian isikan
```
server {
    listen 80;
    server_name prestashop.task.my.id;

    location / {
	proxy_set_header Host $host;
	proxy_set_header Accept-Encoding "";
	proxy_pass http://prestashop.task.my.id:8080;
    }
}
```

**2. Wordpress**
```
server {
    listen 80;
    server_name wordpress.task.my.id;

    location / {
	proxy_set_header Host $host;
	proxy_set_header Accept-Encoding "";
	proxy_pass http://wordpress.task.my.id:8080;
    }
}
```
**3. Nextcloud**
```
server {
    listen 80;
    server_name nextcloud.task.my.id;

    location / {
	proxy_set_header Host $host;
	proxy_set_header Accept-Encoding "";
	proxy_pass http://nextcloud.task.my.id:8080;
    }
}
```
**4. Phpmyadmin**
```
server {
    listen 80;
    server_name console-sql.task.my.id;

    location / {
	proxy_set_header Host $host;
	proxy_set_header Accept-Encoding "";
	proxy_pass http://nextcloud.task.my.id:8080;
    }
}
```

Cek apakah ada error pada konfigurasi kita
```
# nginx -t
```
Restart nginx
```
# systemctl restart nginx
```

Jika sudah lakukan pengecekan kembali dengan curl
```
# curl -I prestashop.task.my.id/test.php
```
Output:
```
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Sun, 08 Mar 2020 08:01:26 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 25
Connection: keep-alive
Last-Modified: Sun, 08 Mar 2020 07:41:33 GMT
ETag: "19-5a05303fcdfb0"
Accept-Ranges: bytes
```
Perhatikan pada bagian Server, pastikan server nya nginx

lalu coba curl website lainnya juga dan pastikan server nya nginx

Installasi prestashop, wordpress, nextcloud dan phpmyadmin
==============
### 1. Prestashop
#### Step 1: Konfigurasi php untuk prestashop
Buka konfigurasi php.ini
```
# vim /etc/opt/remi/php71/php.ini
```
Lalu ubah beberapa bagian menjadi
```
file_uploads = On
allow_url_fopen = On
memory_limit = 1024M
max_execution_time = 18000
upload_max_filesize = 256M
```
#### Step 2: Download dan konfigurasi prestashop
Masuk ke dir root prestashop
```
# cd /home/prestashop
```
Kemudian hapus file index.html dan test.php yang sudah kita buat
```
# rm -f test.php
```
Download prestashop
```
# curl -O https://download.prestashop.com/download/releases/prestashop_1.7.6.4.zip
```
Unzip prestashop dan hapus archive
```
# unzip prestashop_1.7.2.4.zip
# rm -f prestashop_1.7.2.4.zip
```
Ubah permission dan kepilikan directory
```
# chown -R prestashop:prestashop /home/prestashop
# chmod -R 755 /home/prestashop
```
Setup prestashop dengan mengakses prestashop.task.my.id di browser

<img src="https://git.leon36.web.id/yukitoki/Reverse-Proxy-with-Nginx/raw/master/images/ss-5.png" width="650">

Tunggu hingga selesai

<img src="https://git.leon36.web.id/yukitoki/Reverse-Proxy-with-Nginx/raw/master/images/ss-6.png" width="650">

Lalu setup seperti biasa

<img src="https://git.leon36.web.id/yukitoki/Reverse-Proxy-with-Nginx/raw/master/images/ss-7.png" width="650">

Selamat prestashop berhasil diinstall

### 2.Wordpress
#### Step 1: Konfigurasi php untuk wordpress
Buka konfigurasi php.ini
```
# vim /etc/opt/remi/php72/php.ini
```
Lalu ubah beberapa bagian menjadi
```
file_uploads = On
max_execution_time = 180
memory_limit = 256M
upload_max_filesize = 64M
```
Restart php dan apache
```
# systemctl restart php72-php-fpm
# systemctl restart httpd
```
#### Step 2: Download dan konfigurasi wordpress
Masuk ke dir root wordpress
```
# cd /home/wordpress
```
Kemudian hapus file index.html dan test.php yang sudah kita buat
```
# rm -f index.html test.php
```
Download wordpress
```
# wget https://wordpress.org/latest.tar.gz
```
Untar wordpress dan hapus archive
```
# tar -xzvf latest.tar.gz
# rm -f latest.tar.gz
```
Kemudian pindahkan isi wordpress ke /home/wordpress karena dir root weabsite kita berada pada /home/wordpress, dan hapus directory kosong wordpress
```
# mv wordpress/* .
# rm -rf wordpress
```
Copy config sample wordpress
```
# cp /home/wordpress/wp-config-sample.php /home/wordpress/wp-config.php
```
Kemudian edit isi config.php
```
# vim /home/wordpress/wp-config.php
```
Ganti databse,user dan password dibawah dengan database yang sudah dibuat tadi
```
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'wordpressuser');

/** MySQL database password */
define('DB_PASSWORD', 'wordpresspass');

/** MySQL hostname */
define('DB_HOST', '10.148.0.9');

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');
```
Ubah permission dan kepilikan directory
```
# chown -R wordpress:wordpress /home/wordpress
# chmod -R 755 /home/wordpress
```
Kemudian akses wordpress.task.my.id

Setup seperti biasa

<img src="https://git.leon36.web.id/yukitoki/Reverse-Proxy-with-Nginx/raw/master/images/ss-8.png" width="650">

Selamat wordpress berhasil diinstall
### 3. nextcloud
#### Step 1: Download dan konfigurasi nextcloud
Masuk ke dir root nextcloud
```
# cd /home/nextcloud
```
Kemudian hapus file index.html dan test.php yang sudah kita buat
```
# rm -f test.php
```
Download nextcloud
```
# wget https://download.nextcloud.com/server/releases/latest-17.zip
```
Unzip nextcloud dan hapus archive
```
# unzip latest-17.zip
# rm -f latest-17.zip
```
Kemudian pindahkan isi nextcloud ke /home/nextcloud
```
# mv nextcloud/* .
# rm -rf nextcloud
```
Ubah permission dan kepilikan directory
```
# chown -R nextcloud:nextcloud /home/nextcloud
# chmod -R 755 /home/nextcloud
```
Selanjutnya akses nextcloud.task.my.id dan lakukan setup

<img src="https://git.leon36.web.id/yukitoki/Reverse-Proxy-with-Nginx/raw/master/images/ss-9.png" width="650">

Selamat nextcloud berhasil diinstall
### 4.phpmyadmin
#### Step 1: Install phpmyadmin
```
# yum -y install phpmyadmin
```
Link phpmyadmin
```
ln -s /usr/share/phpMyAdmin
```
#### Step 2: Konfigurasi virtualhost dan serverblock untuk phpmyadmin
*** 1.Konfigurasi virtualhost pana node2***
```
# vim /etc/httpd/conf.d/phpmyadmin.conf
```
```
<VirtualHost *:8080>
    ServerName console-sql.task.my.id
    ServerAdmin admin@task.my.id
    DocumentRoot /var/www/html/phpmyadmin
    ErrorLog /var/www/html/phpmyadmin/error.log
    CustomLog /var/www/html/phpmyadmin/requests.log combined
      <FilesMatch \.php$>
         SetHandler "proxy:fcgi://127.0.0.1:9071"
      </FilesMatch>
      <Directory /var/www/html/phpmyadmin>
        <IfModule mod_dir.c>
           DirectoryIndex index.php index.html index.htm
        </IfModule>
        AllowOverride all
        Order allow,deny
        Allow from all
      </Directory>
</VirtualHost>
```
*** 2.Konfigurasi server block pada node1***
```
# vim /etc/nginx/conf.d/
```
```
server {
    listen 80;
    server_name console-sql.task.my.id;

    location / {
        proxy_set_header Host $host;
        proxy_set_header Accept-Encoding "";
        proxy_pass http://console-sql.task.my.id:8080;
    }
}
```
Kemudian coba akses console-sql.task.my.id

<img src="https://git.leon36.web.id/yukitoki/Reverse-Proxy-with-Nginx/raw/master/images/ss-10.png" width="650">

Selamat phpmyadmin sudah terinstall

*** 3. Buat user untuk phpmyadmin***
```
# mysql -u root -p
```
```
CREATE USER 'user'@'%' IDENTIFIED BY 'user';
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
```

Selanjunya coba login dengan user yang sudah di buat

<img src="https://git.leon36.web.id/yukitoki/Reverse-Proxy-with-Nginx/raw/master/images/ss-11.png" width="650">