diff --git a/README.md b/README.md index b46119d..022ea39 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,754 @@ Reverse-Proxy-Nginx-Multiple-Node =============== +Dokumentasi untuk Lab Reverse Proxy Nginx with Multiple Node + + + +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 + + +* 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 mtu 1460 + inet 10.148.0.9 netmask 255.255.255.255 broadcast 10.148.0.9 + inet6 fe80::4001:aff:fe94:9 prefixlen 64 scopeid 0x20 + 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 +``` + + + +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'@'localhost' IDENTIFIED BY 'prestashoppass'; +``` +#### 2. Nextcloud +``` +CREATE DATABASE nextcloud; +GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost' IDENTIFIED BY 'nextcloudpass' WITH GRANT OPTION; +``` +#### 3. Wordpress +``` +CREATE DATABASE wordpress; +GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'localhost' IDENTIFIED BY 'wordpresspass' WITH GRANT OPTION; +``` +#### 4. Phpmyadmin +``` +CREATE USER 'admin'@'%' IDENTIFIED BY 'password_here'; +GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION; +FLUSH PRIVILEGES; +EXIT; +``` + +Konfigurasi apache dan php pada node2 +============= +Tambahkan user baru +``` +# useradd wordpress +# useradd prestashop +# useradd nextcloud +``` +Kemudian tambahkan host untuk domain kita dengan listen ip private untuk mengarahkan request dari nginx nantinya +``` +# vim /etc/hosts +``` + + +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 +``` + + +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 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 + + + +Kemudian scrol kebawah, di bagian +``` + + AllowOverride FileInfo AuthConfig Limit Indexes + Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec + Require method GET POST OPTIONS + +``` +Hapus public_html, lihat gambar di bawah + + + +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 +``` + + ServerName prestashop.task.my.id + ServerAdmin admin@task.my.id + DocumentRoot /home/prestashop + ErrorLog /home/prestashop/error.log + CustomLog /home/prestashop/requests.log combined + + SetHandler "proxy:fcgi://127.0.0.1:9071" + + + + DirectoryIndex index.php index.html index.htm + + AllowOverride all + Order allow,deny + Allow from all + + +``` +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** +``` + + ServerName wordpress.task.my.id + ServerAdmin admin@task.my.id + DocumentRoot /home/wordpress + ErrorLog /home/wordpress/error.log + CustomLog /home/wordpress/requests.log combined + + SetHandler "proxy:fcgi://127.0.0.1:9072" + + + + DirectoryIndex index.php index.html index.htm + + AllowOverride all + Order allow,deny + Allow from all + + +``` +Disini kita sesuaikan juga user dan listen portnya menjadi :9072 + +**3. Virtualhost untuk nextcloud** +``` + + ServerName nextcloud.task.my.id + ServerAdmin admin@task.my.id + DocumentRoot /home/nextcloud + ErrorLog /home/nextcloud/error.log + CustomLog /home/nextcloud/requests.log combined + + SetHandler "proxy:fcgi://127.0.0.1:9073" + + + + DirectoryIndex index.php index.html index.htm + + AllowOverride all + Order allow,deny + Allow from all + + +``` +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 " /home/nextcloud/test.php +# echo " /home/wordpress/test.php +# echo " /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 +=============== +Kemudian tambahkan host dengan ip private dari node2 untuk mengarahkan kemana kita akan mengakses website nya +``` +# vim /etc/hosts +``` + + + +Install dan enable nginx +``` +# yum -y install 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; + } +} +``` + +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: Tambahkan database dan user untuk prestashop +``` +# mysql -u root -p +``` +``` +CREATE DATABASE prestashop; +GRANT ALL PRIVILEGES ON prestashop.* TO 'prestashopuser'@'localhost' IDENTIFIED BY 'prestashoppass'; +FLUSH PRIVILEGES; +EXIT; +``` +#### Step 2: 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 = 256M +upload_max_filesize = 64M +``` +#### Step 3: 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 index.html 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 + + + +Tunggu hingga selesai + + + +Lalu setup seperti biasa + + + +Selamat prestashop berhasil diinstall + +### 2.Wordpress +#### Step 1: Tambahkan database dan user untuk wordpress +``` +# mysql -u root -p +``` +``` +CREATE DATABASE wordpress; +GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'localhost' IDENTIFIED BY 'wordpresspass' WITH GRANT OPTION; +FLUSH PRIVILEGES; +EXIT; +``` +#### Step 2: 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 3: 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 +``` +Ubah permission dan kepilikan directory +``` +# chown -R wordpress:wordpress /home/wordpress +# chmod -R 755 /home/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', 'localhost'); + +/** 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', ''); +``` +Simpan dan keluar, kemudian akses wordpress.task.my.id + +Setup seperti biasa + + + +Selamat wordpress berhasil diinstall +### 3. nextcloud +#### Step 1: Tambahkan database dan user untuk nextcloud +``` +# mysql -u root -p +``` +``` +CREATE DATABASE nextcloud; +GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost' IDENTIFIED BY 'nextcloudpass' WITH GRANT OPTION; +FLUSH PRIVILEGES; +EXIT; +``` +#### Step 2: 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 index.html 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 + + + +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*** +``` +# vim /etc/httpd/conf.d/phpmyadmin.conf +``` +``` + + 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 + + SetHandler "proxy:fcgi://127.0.0.1:9071" + + + + DirectoryIndex index.php index.html index.htm + + AllowOverride all + Order allow,deny + Allow from all + + +``` +*** 2.Konfigurasi server block*** +``` +# 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 + + + +Selamat phpmyadmin sudah terinstall + +*** 3. Buat user untuk phpmyadmin*** +``` +# mysql -u root -p +``` +``` +CREATE USER 'admin'@'%' IDENTIFIED BY 'password_here'; +GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION; +FLUSH PRIVILEGES; +EXIT; +``` + +Selanjunya coba login dengan user yang sudah di buat + +