Το προφίλ μας στο Google Plus
2

Χτίσιμο LEMP stack στο openSUSE

Το ακρωνύμιο LEMP αναφέρεται στο σύνολο του λογισμικού που αποτελείται από τον διακομιστή ιστοσελίδων nginx (προφέρεται engine-ex), τη σχεσιακή βάση δεδομένων MySQL, τη σκριπτογλώσσα PHP και κάποια διανομή του Linux. Ένα μηχάνημα με LEMP stack, όπως λέμε, είναι ικανό να σερβίρει web sites με δυναμικό περιεχόμενο ή να φιλοξενεί web applications γενικότερα.

Αν για παράδειγμα θέλετε να βασίσετε το site σας στο WordPress, τότε μία από τις επιλογές σας είναι ένας server με LEMP stack. Στο παρόν άρθρο δείχνουμε, αναλυτικά και βήμα προς βήμα, πώς εγκαθιστούμε μια τέτοια στοίβα λογισμικού όταν έχουμε έναν host με openSUSE Leap και αντί για τη MySQL θέλουμε να χρησιμοποιήσουμε τη MariaDB. Για την εφαρμογή των ενεργειών που περιγράφουμε μπορείτε να εργαστείτε σε ένα VPS με openSUSE –οι Hetzner και Linode είναι δύο VPS providers που υποστηρίζουν και το openSUSE– ή, εναλλακτικά, σε μια εικονική μηχανή ή σ’ έναν τοπικό server.

VPS με openSUSE Leap
Σε αυτό το άρθρο συζητάμε για την εγκατάσταση και τη ρύθμιση του openSUSE Leap σε VPS της Hetzner. Όλα όσα παρουσιάζουμε για το openSUSE εφαρμόζονται παρόμοια κι όταν έχετε άλλον provider ή όταν δουλεύετε σε εικονική μηχανή ή τοπικό server.

Προετοιμασία συστήματος κι εγκατάσταση nginx
Μέσω SSH συνδεόμαστε στον host με το openSUSE κι αποκτάμε πρόσβαση στο λογαριασμό του root. Έχουμε βεβαίως τη δυνατότητα να εργαστούμε κι από το λογαριασμό κάποιου απλού χρήστη, αρκεί αυτός να έχει τη δυνατότητα ανάληψης δικαιωμάτων root, π.χ., μέσω του εργαλείου sudo.

Πρώτο μας μέλημα είναι να φρεσκάρουμε τα περιεχόμενα των αποθετηρίων (repositories):

hekla:~ # zypper ref

Μετά εφαρμόζουμε patches, αν υπάρχουν, με ενημερώσεις ασφαλείας και bug fixes:

hekla:~ # zypper patch

Ξεκινάμε με το πρώτο συστατικό του LEMP stack, το οποίο δεν είναι άλλο από τον nginx:

hekla:~ # zypper -n in nginx

Μετά την εγκατάστασή του στο openSUSE, ο nginx δεν τρέχει:

hekla:~ # systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: inactive (dead) 

Τον ξεκινάμε, λοιπόν…

hekla:~ # systemctl start nginx

…φροντίζουμε ώστε η αντίστοιχη υπηρεσία να ενεργοποιείται αυτόματα κατά την εκκίνηση του λειτουργικού…

hekla:~ # systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

…και βεβαιωνόμαστε ότι όλα είναι καλά:

hekla:~ # systemctl status -l nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since fös 2017-04-14 06:59:56 GMT; 2min 38s ago
 Main PID: 3921 (nginx)
   CGroup: /system.slice/nginx.service
           ├─3921 nginx: master process /usr/sbin/nginx -g daemon off
           └─3925 nginx: worker process

Systemd και διαχείριση υπηρεσιών
Για το Systemd και τη διαχείριση υπηρεσιών, όπως είναι εκείνη του nginx, μπορείτε να διαβάσετε το σχετικό άρθρο που φιλοξενούμε εδώ.

Πιθανώς το firewall να είναι ενεργοποιημένο για τον server μας –ή τουλάχιστον έτσι θα έπρεπε–, οπότε σ’ αυτή την περίπτωση οφείλουμε να βεβαιωθούμε ότι το port 80/TCP είναι ανοικτό. Υποθέτουμε ότι το firewall είναι πράγματι ενεργοποιημένο, καθώς κι ότι αρχικά επιτρέπει την πρόσβαση μόνο στο port 22/TCP (για συνδέσεις SSH). Παρεμπιπτόντως, να ένας τρόπος για να βλέπουμε την κατάστασή του:

hekla:~ # systemctl status SuSEfirewall2
● SuSEfirewall2.service - SuSEfirewall2 phase 2
   Loaded: loaded (/usr/lib/systemd/system/SuSEfirewall2.service; enabled; vendor preset: disabled)
   Active: active (exited) since fös 2017-04-14 06:45:59 GMT; 39min ago
 Main PID: 3591 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/SuSEfirewall2.service

Πώς του ζητάμε να επιτρέπει και συνδέσεις στο port 80/TCP; Υπάρχουν διάφοροι τρόποι κι αμέσως τώρα ακολουθούμε έναν ο οποίος θα μπορούσε να λεχθεί ότι είναι συμβατός με το “openSUSE way”. Αρχικά, μεταβαίνουμε στον κατάλογο /etc/sysconfig/SuSEfirewall2.d/services:

hekla:~ # cd /etc/sysconfig/SuSEfirewall2.d/services

Ρίξτε μια ματιά στα περιεχόμενά του:

hekla:/etc/sysconfig/SuSEfirewall2.d/services # ls -lh
total 32K
-rw-r--r-- 1 root root  146 júl 22  2016 mosh
-rw-r--r-- 1 root root  707 apr  5 12:11 nfs-client
-rw-r--r-- 1 root root  343 des 19 17:18 ntp
-rw-r--r-- 1 root root  762 okt  8  2016 rsync-server
-rw-r--r-- 1 root root  126 mar 29 14:35 samba-client
-rw-r--r-- 1 root root  375 okt  8  2016 smtp
-rw-r--r-- 1 root root  135 jan 25 08:51 sshd
-rw-r--r-- 1 root root 1,5K okt  7  2016 TEMPLATE

Διάφορες υπηρεσίες αφήνουν εδώ αρχεία ρυθμίσεων για το SuSEfirewall2. Στα εν λόγω αρχεία κατ’ ελάχιστον παρατίθενται τα ports που πρέπει να είναι ανοικτά για το External Zone του firewall. Το πακέτο nginx που μόλις εγκαταστήσαμε δεν έχει αφήσει κάποιο σχετικό αρχείο στον κατάλογο services. Γι’ αυτό κι εμείς θ’ αντιγράψουμε το TEMPLATE, μετονομάζοντάς το σε nginx:

hekla:/etc/sysconfig/SuSEfirewall2.d/services # cp TEMPLATE nginx

Το τροποποιούμε καταλλήλως με τον text editor της προτίμησής μας:

hekla:/etc/sysconfig/SuSEfirewall2.d/services # vi nginx

Δείτε τα περιεχόμενα του δικού μας nginx:

## Name: nginx
## Description: Open ports 80/TCP & 443/TCP for the nginx web server

# space separated list of allowed TCP ports
TCP="80 443"

Αν και πριν λίγο σκεφτήκαμε ν’ ανοίξουμε το port 80/TCP για απλές συνδέσεις HTTP, ανοίξαμε τελικά και το port 443/TCP για ασφαλείς συνδέσεις HTTPS. Είτε φτιάξουμε το δικό μας self-signed πιστοποιητικό είτε πάρουμε ένα έγκυρο από το Let’s Encrypt project, με μηδενικό κόστος θα παρέχουμε ασφαλείς συνδέσεις TLS για τα sites και τις εφαρμογές που φιλοξενεί ο nginx. Αλλά για το όλο θέμα θα συζητήσουμε σε άλλο άρθρο, με την άνεσή μας. Προς το παρόν, ας υποδείξουμε στο firewall τα δύο νέα ports τα οποία πρέπει να είναι ανοικτά. Καταφεύγουμε στο module του YaST ονόματι firewall:

hekla:/etc/sysconfig/SuSEfirewall2.d/services # yast firewall

Στο screenshot που ακολουθεί φαίνεται το πώς ανοίξαμε τα δύο ports του nginx για το External Zone του firewall.

Χάρη στο module του YaST ονόματι firewall, είναι πολύ εύκολο να επιτρέψουμε την πρόσβαση από τον έξω κόσμο στα δύο ports που χρησιμοποιεί ο nginx web server.

Χάρη στο module του YaST ονόματι firewall, είναι πολύ εύκολο να επιτρέψουμε την πρόσβαση από τον έξω κόσμο στα δύο ports που χρησιμοποιεί ο nginx web server.

Αφού εγκαταλείψουμε το YaST, ας βεβαιωθούμε ότι τα ports 80/TCP και 443/TCP είναι ανοικτά:

hekla:~ # iptables -S
[...]
-A input_ext -p tcp -m limit --limit 3/min -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "SFW2-INext-ACC-TCP " --log-tcp-options --log-ip-options
-A input_ext -p tcp -m tcp --dport 80 -j ACCEPT
-A input_ext -p tcp -m limit --limit 3/min -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -j LOG --log-prefix "SFW2-INext-ACC-TCP " --log-tcp-options --log-ip-options
-A input_ext -p tcp -m tcp --dport 443 -j ACCEPT
[...]

Μια χαρά όλα, μόνο που ξεχάσαμε να δούμε τι γίνεται με τον nginx. Μεταβαίνουμε αμέσως στον κατάλογο /srv/www/htdocs και φτιάχνουμε ένα πολύ απλό αρχείο HTML, το οποίο περιλαμβάνει ένα σύντομο μήνυμα καλωσορίσματος (σε όποια γλώσσα θέλουμε :D):

hekla:/srv/www/htdocs # echo "<h1>Velkomið að nginx @ hekla.colder.local</h1>" > index.html

(Το hekla.colder.local είναι το FQDN του host με το openSUSE, για το τοπικό μας δίκτυο.) Ανοίγουμε έναν οποιονδήποτε web browser και στη μπάρα διευθύνσεων γράφουμε το FQDN ή το αριθμητικό IP του host με το openSUSE. Αν δούμε το μήνυμα καλωσορίσματος που μόλις πληκτρολογήσαμε, τότε ο nginx είναι πολύ χαρούμενος και δουλεύει μια χαρά.

Ξεκινώντας από έναν οποιονδήποτε web browser, με μια σύντομη επίσκεψη στο FQDN του openSUSE server διαπιστώνουμε ότι ο nginx δουλεύει όπως προβλέπεται. Έχουμε ακόμη αρκετή δουλειά για ένα πλήρες LEMP stack, καλό είναι όμως να γνωρίζουμε ότι βρισκόμαστε στο σωστό δρόμο.

Ξεκινώντας από έναν οποιονδήποτε web browser, με μια σύντομη επίσκεψη στο FQDN του openSUSE server διαπιστώνουμε ότι ο nginx δουλεύει όπως προβλέπεται. Έχουμε ακόμη αρκετή δουλειά για ένα πλήρες LEMP stack, καλό είναι όμως να γνωρίζουμε ότι βρισκόμαστε στο σωστό δρόμο.

Βρείτε το πραγματικά δημόσιο IP
Αν διαθέτουμε κάποιο domain και, για αυτό ή για κάποιο subdomain του σχεδιάζουμε να δημιουργήσουμε ένα A record που θα δείχνει προς τον host με το openSUSE, χρειαζόμαστε το δημόσιο IP του προαναφερθέντος. Προσέξτε ότι αυτό δεν είναι κατ’ ανάγκη εκείνο που παρατίθεται στην έξοδο της εντολής ip addr, ακόμη κι αν εργαζόμαστε σε VPS (ορισμένοι providers, όπως η Hetzner, έχουν τα VPS των πελατών πίσω από NAT firewalls). Ένας τρόπος για να μαθαίνουμε το δημόσιο IP με το οποίο ο server μας φαίνεται στο Internet, είναι πληκτρολογώντας dig +short myip.opendns.com @resolver1.opendns.com.

Εγκατάσταση και ρύθμιση MariaDB
Η εγκατάσταση της MariaDB γίνεται κατά τα αναμενόμενα:

hekla:~ # zypper -n in mariadb

Με την ολοκλήρωση της διαδικασίας συνειδητοποιούμε ότι υπήρχε κάποιο ενημερωτικό μήνυμα, το οποίο όμως δεν εμφανίστηκε λόγω της χρήσης της παραμέτρου -n:

Update notifications were received from the following packages:
mariadb-10.0.29-18.1.x86_64 (/var/adm/update-messages/mariadb-10.0.29-18.1)
View the notifications now? [y/n] (n): n

Το μήνυμα που δεν είδαμε είναι στο αρχείο /var/adm/update-messages/mariadb-10.0.29-18.1, οπότε ας του ρίξουμε μια ματιά τώρα:

hekla:~ # cat /var/adm/update-messages/mariadb-10.0.29-18.1
You just installed MySQL server for the first time.

You can start it using:
 rcmysql start

During first start empty database will be created for your automatically.

PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !
To do so, start the server, then issue the following commands:

'/usr/bin/mysqladmin' -u root password 'new-password'
'/usr/bin/mysqladmin' -u root -h <hostname> password 'new-password'

Alternatively you can run:
'/usr/bin/mysql_secure_installation'

which will also give you the option of removing the test
databases and anonymous user created by default. This is
strongly recommended for production servers.

Μάλιστα. Η σημαντική πληροφορία στο προηγούμενο μήνυμα είναι ότι, προκειμένου να έχουμε μια ασφαλή εγκατάσταση της MariaDB, οφείλουμε να τρέξουμε το script ονόματι /usr/bin/mysql_secure_installation. Πρώτα ενεργοποιούμε την υπηρεσία της MariaDB…

hekla:~ # systemctl start mysql

…μετά βεβαιωνόμαστε ότι τρέχει…

hekla:~ # systemctl status mysql
● mysql.service - MySQL server
   Loaded: loaded (/usr/lib/systemd/system/mysql.service; disabled; vendor preset: disabled)
   Active: active (running) since fös 2017-04-14 09:41:40 GMT; 53s ago
  Process: 2601 ExecStartPost=/usr/lib/mysql/mysql-systemd-helper wait (code=exited, status=0/SUCCESS)
  Process: 2587 ExecStartPre=/usr/lib/mysql/mysql-systemd-helper upgrade (code=exited, status=0/SUCCESS)
  Process: 2493 ExecStartPre=/usr/lib/mysql/mysql-systemd-helper install (code=exited, status=0/SUCCESS)
 Main PID: 2600 (mysqld)
    Tasks: 23 (limit: 512)
   CGroup: /system.slice/mysql.service
           └─2600 /usr/sbin/mysqld --defaults-file=/etc/my.cnf --user=mysql

…ύστερα τρέχουμε το /usr/bin/mysql_secure_installation:

hekla:~ # /usr/bin/mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y
New password:	
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Εξ ορισμού, το password για τον χρήστη root της MariaDB δεν υπάρχει, γι’ αυτό κι όταν μας ζητείται πατάμε απλά το πλήκτρο [Enter]. Στη συνέχεια ορίζουμε ένα password για το χρήστη root της MariaDB (για λόγους ασφαλείας το πληκτρολογούμε δύο φορές και δεν φαίνεται στο τερματικό), διαγράφουμε τους υπάρχοντες ανώνυμους χρήστες της βάσης, απαγορεύουμε τα απομακρυσμένα login στο λογαριασμό root της MariaDB, διαγράφουμε την υπάρχουσα δοκιμαστική βάση και, τέλος, υποχρεώνουμε το σύστημα να λάβει υπόψη όλες τις αλλαγές που μόλις πραγματοποιήσαμε. Όπως διαπιστώνετε κι εσείς, εκτός από τον καθορισμό password για τον root της MariaDB σε όλες τις άλλες ερωτήσεις αρκεί να δώσουμε τις προεπιλεγμένες απαντήσεις.

Θέλουμε η MariaDB να ξεκινά αυτόματα κατά την εκκίνηση του λειτουργικού, γι’ αυτό κι ενεργοποιούμε τη σχετική υπηρεσία:

hekla:~ # systemctl enable mysql
Created symlink from /etc/systemd/system/multi-user.target.wants/mysql.service to /usr/lib/systemd/system/mysql.service.

Γιατί βλέπουμε διαρκώς αναφορές στη MySQL;
Η MariaDB αναπτύσσεται από την κοινότητα του Ανοικτού/Ελεύθερου Λογισμικού και αποτελεί fork της γνωστής MySQL, η οποία από το 2010 ανήκει στην Oracle. Οι συχνές εμφανίσεις του ονόματος MySQL δεν πρέπει να μας προκαλούν εντύπωση, αφού η MariaDB έχει σχεδιαστεί ως drop-in replacement της MySQL. Μ’ άλλα λόγια, όποιο εργαλείο ή εντολή χρησιμοποιούμε σε μια εγκατάσταση της MySQL, το ίδιο ακριβώς εργαλείο ή εντολή χρησιμοποιούμε και σε μια εγκατάσταση της MariaDB.

Εγκατάσταση PHP για την παραγωγή δυναμικού περιεχομένου
Στο LEMP stack που χτίζουμε προς το παρόν υπάρχει το Linux (προφανώς), ο web server (nginx), καθώς και η σχεσιακή βάση δεδομένων (MariaDB). Ο nginx σερβίρει ιστοσελίδες, ενώ η MariaDB αποθηκεύει δεδομένα και συσχετισμούς μεταξύ διαφορετικών οντοτήτων. Αυτό που λείπει είναι κάτι για την παραγωγή δυναμικού περιεχομένου. Θα καταφύγουμε στη γλώσσα PHP. Επειδή ο nginx δεν έχει την παραμικρή ιδέα για την PHP, θα εγκαταστήσουμε πρώτα το module από το πακέτο php5-fpm (FastCGI Process Manager) και, μετά από ορισμένες απαραίτητες ρυθμίσεις, θα πούμε στον web server να στέλνει τα όποια αιτήματα PHP στην αντίστοιχη διεργασία. Θα εγκαταστήσουμε επίσης και το module από το πακέτο php5-mysql, ώστε η PHP να είναι σε θέση να επικοινωνεί με τη MariaDB. Υπάρχει και μια σειρά από άλλα πακέτα που αξίζει να εγκαταστήσουμε, τα οποία για τις ανάγκες του παρόντος δεν έχει νόημα ν’ αναφέρουμε ένα προς ένα:

hekla:~ # zypper -n in php5 php5-gd php5-fpm php5-pear php5-mysql php5-gettext php5-suhosin php5-mbstring

Μετά την εγκατάσταση των πακέτων πηγαίνουμε στον κατάλογο /etc/php5/fpm…

hekla:~ # cd /etc/php5/fpm

…και αντιγράφουμε το αρχείο php-fpm.conf.default στο php-fpm.conf:

hekla:/etc/php5/fpm # cp php-fpm.conf.default php-fpm.conf

Ανοίγουμε το αρχείο php-fpm.conf με τον editor της προτίμησής μας και φροντίζουμε ώστε οι γραμμές…

;error_log = log/php-fpm.log
user = nobody
group = nobody
listen = 127.0.0.1:9000
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660

…να τροποποιηθούν και να γίνουν όπως οι ακόλουθες:

error_log = log/php5-fpm.log
user = nginx
group = nginx
listen = /var/run/php5-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

Αν βοηθάει, ιδού και το diff μεταξύ του πρωτότυπου αρχείου php-fpm.conf.default και του τροποποιημένου php-fpm.conf:

hekla:/etc/php5/fpm # diff php-fpm.conf.default php-fpm.conf
32c32
&lt; ;error_log = log/php-fpm.log
---
> error_log = log/php5-fpm.log
148,149c148,149
&lt; user = nobody
&lt; group = nobody
---
> user = nginx
> group = nginx
159c159
&lt; listen = 127.0.0.1:9000
---
> listen = /var/run/php5-fpm.sock
170,172c170,172
&lt; ;listen.owner = nobody
&lt; ;listen.group = nobody
&lt; ;listen.mode = 0660
---
> listen.owner = nginx
> listen.group = nginx
> listen.mode = 0660

Αφού τελειώσουμε με τις αλλαγές στο php-fpm.conf πηγαίνουμε στον κατάλογο /etc/php5/cli:

hekla:/etc/php5/fpm # cd /etc/php5/cli

Ανοίγουμε το αρχείο php.ini, εντοπίζουμε τη γραμμή

;cgi.fix_pathinfo=1

και την αλλάζουμε ώστε να είναι ακριβώς όπως η ακόλουθη:

cgi.fix_pathinfo=0

Χωρίς αυτή την αλλαγή, όποτε ζητείται ένα αρχείο που δεν υπάρχει τότε η PHP προσπαθεί να εκτελέσει το πιο “κοντινό” αρχείο που μπορεί να εντοπίσει. Έτσι, ένας επιτιθέμενος είναι εύκολο να προκαλέσει την εκτέλεση αρχείων στα οποία κανονικά δεν θα έπρεπε να έχει πρόσβαση. Αποθηκεύουμε την αλλαγή μας στο php.ini και το αντιγράφουμε στον κατάλογο /etc/php5/conf.d:

hekla:/etc/php5/cli # cp php.ini ../conf.d

Στο σημείο αυτό έχουμε τελειώσει με τη ρύθμιση της PHP, μένει όμως να πείσουμε και τον nginx να συνεργαστεί με τον processor της γλώσσας (εν προκειμένω με το php5-fpm).

Συνεργασία nginx και PHP
Η συνεργασία επιτυγχάνεται σε επίπεδο server block, δηλαδή ανά site που φιλοξενεί και σερβίρει ο nginx. Τα server blocks του nginx είναι αντίστοιχα των virtual hosts του Apache και το προκαθορισμένο server block περιγράφεται στο αρχείο /etc/nginx/nginx.conf. Το ανοίγουμε με κάποιον text editor και πραγματοποιούμε τις ακόλουθες δύο αλλαγές.

1. Στο τμήμα

location / {
root   /srv/www/htdocs/;
index  index.html index.htm;
}

και συγκεκριμένα στη γραμμή

index  index.html index.htm;

προσθέτουμε ένα index.php ώστε να γίνει έτσι:

index  index.php index.html index.htm;

2. Κάτω από το τμήμα

error_page   500 502 503 504  /50x.html;
location = /50x.html {
root   /srv/www/htdocs/;
}

προσθέτουμε το ακόλουθο τμήμα:

location ~ \.php$ {
root /srv/www/htdocs;
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Αποθηκεύουμε τις αλλαγές στο nginx.conf κι ελέγχουμε το συντακτικό του αρχείου για λάθη:

hekla:/etc/nginx # nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Εν συνεχεία ξεκινάμε την υπηρεσία php-fpm (χωρίς το “5”)…

hekla:/etc/nginx # systemctl status php-fpm.service

…και φροντίζουμε ώστε να ενεργοποιείται αυτόματα κατά την εκκίνηση του openSUSE:

hekla:/etc/nginx # systemctl enable php-fpm.service 
Synchronizing state of php-fpm.service with SysV init with /usr/lib/systemd/systemd-sysv-install...
Executing /usr/lib/systemd/systemd-sysv-install enable php-fpm
Warning: //etc/init.d/php-fpm is masked by /usr/lib/systemd/system/php-fpm.service.
Try 'chkconfig php-fpm on' instead
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.

Βεβαίως, επενεκκινούμε και τον nginx:

hekla:/etc/nginx # systemctl restart nginx

Πώς βεβαιωνόμαστε ότι ο nginx πράγματι συνεργάζεται με την PHP; Πολύ καλό ερώτημα. Πηγαίνουμε στον κατάλογο που χρησιμοποιεί το προκαθορισμένο server block, ο οποίος δεν είναι άλλος από τον /srv/www/htdocs:

hekla:/etc/nginx # cd /srv/www/htdocs

Δημιουργούμε εκεί ένα πολύ απλό αρχείο PHP, το οποίο όταν εκτελείται επιστρέφει πληροφορίες για το σύστημα:

hekla:/srv/www/htdocs # echo "<?php phpinfo(); ?>" > info.php

Από έναν web browser πηγαίνουμε στη διεύθυνση http://hekla.colder.local/info.php, όπου βέβαια στη θέση του hekla.colder.local εσείς θα βάλετε είτε το FQDN είτε το αριθμητικό IP του δικού σας server. Aν όλα έχουν πάει καλά, στον browser θα δούμε πληθώρα πληροφοριών για το σύστημα. Και κάπως έτσι, λοιπόν, αποκτήσαμε έναν οpenSUSE Leap server με καλορυθμισμένο LEMP stack.

Ο nginx είναι πλέον ικανός να μεταχειρίζεται αρχεία PHP χάρη στο php-fpm -- κι εμείς έχουμε ένα πλήρες LEMP stack στον openSUSE server μας. Παρεμπιπτόντως, το αρχείο info.php που δημιουργήσαμε πριν λίγο δεν το χρειαζόμαστε άλλο και τώρα μπορούμε να το διαγράψουμε.

Ο nginx είναι πλέον ικανός να μεταχειρίζεται αρχεία PHP χάρη στο php-fpm — κι εμείς έχουμε ένα πλήρες LEMP stack στον openSUSE server μας. Παρεμπιπτόντως, το αρχείο info.php που δημιουργήσαμε πριν λίγο δεν το χρειαζόμαστε άλλο και τώρα μπορούμε να το διαγράψουμε.

2 Responses to “Χτίσιμο LEMP stack στο openSUSE”

  1. an0ndev | 16/04/2017 at 16:44

    Υπάρχει κάποιος λόγος που βάλατε php v5 ? Το λέω αυτό γιατί υπάρχει η 7 :P keep up the good work!!!

    • subZraw | 16/04/2017 at 16:58

      Η αντικατάσταση της PHP5 με την PHP7 γίνεται πανεύκολα, αρκεί ο ενδιαφερόμενος να αλλάξει ένα μόνο ψηφίο. Ο λόγος που προτιμήσαμε την PHP5 είναι γιατί έχουμε συναντήσει κάποια θέματα με την PHP7 — συγκεκριμένα με κάποια modules για τον Apache, που για το openSUSE τουλάχιστον διατίθενται μόνο στην έκδοση 5. Στο συγκεκριμένο άρθρο βέβαια δεν ασχολούμαστε με τον Apache, αποφασίσαμε όμως να ακολουθήσουμε την πεπατημένη. Αν τώρα κάποιος θέλει την 7, επαναλαμβάνουμε ότι είναι πανεύκολο να την έχει :)

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων