En este post voy a explicar como configurar el entorno productivo para acoger una instancia de wordpress, y al mismo tiempo poder servir distintos sites (wordpress o no) a través del mismo servidor Apache.
Configurando el entorno productivo:
1) Instalar dependencias: lo primero es instalar el software requerido que será Apache, MySQL, PHPmyAdmin y Wordpress:
$ sudo apt update
$ sudo apt install apache2 \
ghostscript \
libapache2-mod-php \
php \
php-bcmath \
php-curl \
php-imagick \
php-intl \
php-json \
php-mbstring \
php-mysql \
php-xml \
php-zip \
2) Instalar mysql-server: para poder instalar mysql-server hay que hacer alguna tarea adicional, ya que no forma parte de los repositorios de muchas distribuciones linux
$ get https://dev.mysql.com/get/mysql-apt-config_0.8.22-1_all.deb $
sudo dpkg -i mysql-apt-config*$
sudo apt update$
sudo apt install mysql-server$
sudo systemctl status mysqlOutput ● mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: en Active: active (running) since Thu 2022-02-24 18:59:22 UTC; 23min ago Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html Main PID: 3722 (mysqld) Status: "Server is operational" Tasks: 38 (limit: 4915) Memory: 371.7M CGroup: /system.slice/mysql.service └─3722 /usr/sbin/mysqld Feb 24 18:59:21 sql-debian systemd[1]: Starting MySQL Community Server... Feb 24 18:59:22 sql-debian systemd[1]: Started MySQL Community Server.
Copy
3) Instalar wordpress:
$ sudo mkdir -p /var/www/webwordpress
$ sudo chown www-data: /var/www/webwordpress
$ curl https://wordpress.org/latest.tar.gz | sudo -u www-data tar zx -C /var/www/webwordpress
4) Configurar base de datos:
$ sudo mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.20-0ubuntu0.16.04.1 (Ubuntu)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mys ql> CREATE DATABASE wordpress;
Query OK, 1 row affected (0,00 sec)
mysql> CREATE USER wordpress@localhost IDENTIFIED BY '<your-password>';
Query OK, 1 row affected (0,00 sec)
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER
-> ON wordpress.*
-> TO wordpress@localhost;
Query OK, 1 row affected (0,00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 1 row affected (0,00 sec)
mysql> quit
5) Configurar wordpress para conectar con la base de datos:
$ nano /var/www/webwordpress
/wp-config.php ... define( 'DB_NAME', 'wordpress
' ); define( 'DB_USER', 'usuario' ); define( 'DB_PASSWORD', 'password' ); define( 'DB_HOST', 'localhost' ); ... define('AUTH_KEY', '|>Q73D:-=tYT[93RG6tslT?`::fUj7opPnV#+{QbSqzAtFc~-D3*QK&+2qt)S|#&'); define('SECURE_AUTH_KEY', 'IQA$OTJbPwTB`%AJ69M.eG >5s8*G7Vw,~46+8q|<&hCb=ai^Vu]](9Ts)3d^xu['); define('LOGGED_IN_KEY', 'Z`4FP+2OG3V%}gT_Z.^<Pl&N5N&DADg-4xxJR>vG5!v-9zt4b{c(=7WG^e4?W^16'); define('NONCE_KEY', '/S+1wMf6Aj=r-D~@2$=T:vS,-3]%aLLL w7:q8}On7>gLahvpP;+jXN;*_3X8d83'); define('AUTH_SALT', '|}AgGFO60k}Kk6@Kjs:,vt< <-pQ@jXfL8f-`OavKR7X>l_+=J{OzLlK!1`HdLCu'); define('SECURE_AUTH_SALT', '|2F6jk+i$$M<L-H*t-OnyBeYRY-P>3Xq(~ww)5%+RYXaXq]S)&lKkOSYHqn9L++z'); define('LOGGED_IN_SALT', 'zNGGr=rM.=dLc{W;b_{*`+H,O=.,2k`L<uV]T>v(zm$[QC2@U`v|K+7=GFO/*E@:'); define('NONCE_SALT', 'lqUd1UbbuCSVMiTcs+5<J3W$Rypnloogn>6cY!4e$MQcu59sED64k040 ow+]a9#'); ...
Para generar las keys de la parte final puedes utilizar el siguiente API: https://api.wordpress.org/secret-key/1.1/salt/.
6) Configurar Apache para servir Worpress: vamos a configurarlo haciendo uso de virtualhosts para que así podamos luego configurar otro site dentro del mismo servidor:
$ cd /etc/apache2/sites-available/ $ ls -l total 8 -rw-r--r-- 1 root root 1485 feb 5 00:34 webwordpress.com.conf -rw-r--r-- 1 root root 1174 feb 5 00:00 webdjango.com.conf $ sudo nano wordpress.com.conf <VirtualHost *:80> ServerName webwordpress.com ServerAlias www.webwordpress.com Redirect permanent / https://webwordpress.com/ </VirtualHost> <IfModule mod_ssl.c> <VirtualHost *:443> ServerName webwordpress.com ServerAlias www.webwordpress.com ServerAdmin info@webwordpress.com DocumentRoot /var/www/webwordpress
/ <Directory /var/www/webwordpress
> Options FollowSymLinks AllowOverride Limit Options FileInfo DirectoryIndex index.php Require all granted </Directory> <Directory /var/www/webwordpress
/wp-content> Options FollowSymLinks Require all granted </Directory> ErrorLog /var/www/webwordpress
/logs/error.log CustomLog /var/www/webwordpress
/logs/access.log combined SSLCertificateFile /etc/letsencrypt/live/webwordpress
.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/webwordpress
.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost> </IfModule>
6) Activamos el site y los modulos de rewrite y ssl
$ sudo sudo a2enmod ssl rewrite
$ sudo a2ensite webwordpress.com.conf
$ sudo service apache2 reload
7) Acceder a wordpress: si el dominio indicado no lo tenemos registrado, deberemos hacer uso de reglas explicitas de resolución en el fichero /etc/hosts. En este punto asumimos que el dominio si lo tenemos ya registrado (google domains o similar):
http://localhost/ --> Para crear y configurar nuestro sitio wordpress http://localhost/wp-login.php --> Acceso a la parte de administración del sitio
8) Configurar phpmyadmin: este paso es opcional, pero nos puede ayudar mucho a trabajar directamente sobre la base de datos de nuestro wordpress, o incluso a exportar/importar las bases de datos de otros entornos:
$ sudo apt install phpmyadmin $ sudo cp /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf $ sudo a2enconf phpmyadmin $ sudo service apache2 restart
A partir de ahora podremos acceder a phpmyadmin desde nuestro dominio. Si es posible siempre es mejor dejar desactivado este módulo (sudo a2disconf phpmyadmin) salvo que sea extrictamente necesario su uso:
http://tu-dominio.com/phpmyadmin
9) Configurar un sitio adicional: Si adicionalmente necesitamos servir un sitio más en el mismo servidor, tendremos configurado un sites-available adicional en apache. Por ejemplo:
$ sudo nano webdjango.com.conf <VirtualHost *:80> ServerName webdjango.com ServerAlias www.webdjango.com Redirect permanent / https://webdjango.com/ </VirtualHost> <IfModule mod_ssl.c> <VirtualHost *:443> ServerName webdjango.com ServerAlias www.webdjango.com ServerAdmin info@webdjango.com DocumentRoot /var/www/webdjango.com ErrorLog /var/www/webdjango.com/logs/error.log CustomLog /var/www/webdjango.com/logs/access.log combined SSLCertificateFile /etc/letsencrypt/live/webdjango.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/webdjango.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf Alias /cdn_media/ /var/www/webdjango.com/cdn_media/ Alias /cdn_static/ /var/www/webdjango.com/cdn_static/ <Directory /var/www/webdjango.com/cdn_static> Require all granted </Directory> <Directory /var/www/webdjango.com/cdn_media> Require all granted </Directory> WSGIDaemonProcess webdjango.com python-home=/var/www/webdjango.com/webenv python-path=/var/www/webdjango.com/djangoapp WSGIProcessGroup webdjango.com WSGIScriptAlias / /var/www/webdjango.com/djangoapp/web/wsgi.py process-group=webdjango.com <Directory /var/www/webdjango/djangoapp/> <Files wsgi.py> Require all granted </Files> </Directory> </VirtualHost> </IfModule>