{"id":1031,"date":"2026-11-08T03:00:00","date_gmt":"2026-11-08T03:00:00","guid":{"rendered":"https:\/\/vpslake.com\/blog\/?p=1031"},"modified":"2026-11-08T03:00:00","modified_gmt":"2026-11-08T03:00:00","slug":"install-chamilo-lemp-rocky-linux-8","status":"publish","type":"post","link":"https:\/\/vpslake.com\/blog\/2026\/11\/08\/install-chamilo-lemp-rocky-linux-8\/","title":{"rendered":"How to Install Chamilo with LEMP Stack on Rocky Linux 8"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">This guide shows you how to install Chamilo with LEMP Stack on Rocky Linux 8 and finish with a secured HTTPS learning portal. You will deploy Chamilo 1.11.40 with Nginx, MariaDB, PHP 8.3, and SELinux-aware permissions in about 15\u201320 minutes, assuming DNS already points to the VPS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Rocky Linux 8.10 or a fully updated Rocky Linux 8 server, with 2 vCPUs, 2 GB RAM, and at least 10 GB of free disk space.<\/li>\n\n\n<li>Root access or a sudo-enabled account connected over SSH. The commands below assume a non-root user and use <code>sudo<\/code>.<\/li>\n\n\n<li>A public IPv4 address and a domain such as <code>YOUR_DOMAIN<\/code>, with an A record already pointed at the server.<\/li>\n\n\n<li>Ports 22, 80, and 443 allowed in both the VPS firewall and the server&#8217;s <code>firewalld<\/code> policy.<\/li>\n\n\n<li>A long database password, a separate Chamilo administrator password, and an email address for certificate notices.<\/li>\n\n\n<li>A <a href=\"https:\/\/vpslake.com\/buy-vps\">VPSLake Linux VPS<\/a> with enough memory for your expected number of learners and uploaded course files.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Install the Rocky Linux web stack<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Rocky Linux 8&#8217;s default PHP stream is not the right target for the 1.11 branch, so enable PHP 8.3 from Remi before installing PHP-FPM and its extensions.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo dnf update -y\nsudo dnf install -y epel-release firewalld mariadb-server nginx unzip curl bind-utils policycoreutils-python-utils\nsudo dnf install -y https:\/\/rpms.remirepo.net\/enterprise\/remi-release-8.rpm\nsudo dnf module reset php -y\nsudo dnf module enable php:remi-8.3 -y\nsudo dnf install -y php php-cli php-fpm php-curl php-gd php-intl php-mbstring php-mysqlnd php-opcache php-process php-soap php-xml php-zip\nsudo sed -ri 's\/^[; ]*user = .*\/user = nginx\/; s\/^[; ]*group = .*\/group = nginx\/; s\/^[; ]*listen.owner = .*\/listen.owner = nginx\/; s\/^[; ]*listen.group = .*\/listen.group = nginx\/' \/etc\/php-fpm.d\/www.conf\nsudo sed -ri 's\/^memory_limit = .*\/memory_limit = 256M\/; s\/^upload_max_filesize = .*\/upload_max_filesize = 100M\/; s\/^post_max_size = .*\/post_max_size = 100M\/; s\/^max_execution_time = .*\/max_execution_time = 300\/; s\/^max_input_time = .*\/max_input_time = 600\/; s\/^max_input_vars = .*\/max_input_vars = 3000\/' \/etc\/php.ini\nsudo systemctl enable --now firewalld mariadb nginx php-fpm\nsudo systemctl restart php-fpm\nphp -v\nnginx -v\nmariadb --version<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should see PHP 8.3.x, an Nginx version, and a MariaDB client version. Package patch numbers will change as Rocky Linux and Remi publish updates.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PHP 8.3.x (cli) ...\nnginx version: nginx\/...\nmariadb  Ver ...<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Create the Chamilo database<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Chamilo keeps accounts, courses, and portal settings in MariaDB. A local database account restricted to one schema keeps that data separate from other applications on the VPS.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First run the MariaDB hardening wizard and remove anonymous users, the test database, and remote root login when prompted:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mysql_secure_installation<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Create the database after replacing <code>YOUR_DB_PASSWORD<\/code> with a unique password. Do not reuse your SSH or Chamilo administrator password.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mariadb &lt;&lt;'SQL'\nCREATE DATABASE chamilo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nCREATE USER 'chamilo_user'@'localhost' IDENTIFIED BY 'YOUR_DB_PASSWORD';\nGRANT ALL PRIVILEGES ON chamilo.* TO 'chamilo_user'@'localhost';\nFLUSH PRIVILEGES;\nSQL\nsudo mariadb -e \"SHOW DATABASES LIKE 'chamilo';\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The check should return a row named <code>chamilo<\/code>. The database does not need a public port because PHP-FPM will connect through the local socket or loopback interface.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Download Chamilo and label its writable directories<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use the numbered archive listed on the <a href=\"https:\/\/chamilo.org\/en\/download\/\" target=\"_blank\" rel=\"noopener\">official Chamilo download page<\/a> instead of an unversioned development checkout. Chamilo 1.11.40 supports PHP 8.3 and is documented in the <a href=\"https:\/\/11.chamilo.org\/documentation\/installation_guide.html\" target=\"_blank\" rel=\"noopener\">official 1.11 installation guide<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The extraction check below finds the archive&#8217;s top-level directory, so it remains safe if the ZIP layout changes slightly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CHAMILO_VERSION=1.11.40\nsudo curl -fL -o \"\/tmp\/chamilo-${CHAMILO_VERSION}.zip\" \"https:\/\/github.com\/chamilo\/chamilo-lms\/releases\/download\/v${CHAMILO_VERSION}\/chamilo-${CHAMILO_VERSION}.zip\"\nsudo mkdir -p \"\/tmp\/chamilo-${CHAMILO_VERSION}-extract\" \/var\/www\/chamilo\nsudo unzip -q \"\/tmp\/chamilo-${CHAMILO_VERSION}.zip\" -d \"\/tmp\/chamilo-${CHAMILO_VERSION}-extract\"\nCHAMILO_SOURCE=\"$(find \"\/tmp\/chamilo-${CHAMILO_VERSION}-extract\" -type f -path '*\/main\/install\/index.php' -printf '%h\\n' | sed 's#\/main\/install$##' | head -n 1)\"\ntest -n \"$CHAMILO_SOURCE\"\nsudo cp -a \"$CHAMILO_SOURCE\"\/. \/var\/www\/chamilo\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nginx needs to read the application, while only the directories used for configuration and uploads should be writable. The SELinux rules make that permission survive a relabel or reboot.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chown -R root:nginx \/var\/www\/chamilo\nsudo find \/var\/www\/chamilo -type d -exec chmod 0750 {} \\;\nsudo find \/var\/www\/chamilo -type f -exec chmod 0640 {} \\;\nsudo chown -R nginx:nginx \/var\/www\/chamilo\/app \/var\/www\/chamilo\/web \/var\/www\/chamilo\/main\/default_course_document\/images \/var\/www\/chamilo\/main\/lang\nsudo find \/var\/www\/chamilo\/app \/var\/www\/chamilo\/web \/var\/www\/chamilo\/main\/default_course_document\/images \/var\/www\/chamilo\/main\/lang -type d -exec chmod 0770 {} \\;\nsudo find \/var\/www\/chamilo\/app \/var\/www\/chamilo\/web \/var\/www\/chamilo\/main\/default_course_document\/images \/var\/www\/chamilo\/main\/lang -type f -exec chmod 0660 {} \\;\nsudo semanage fcontext -a -t httpd_sys_content_t '\/var\/www\/chamilo(\/.*)?'\nsudo semanage fcontext -a -t httpd_sys_rw_content_t '\/var\/www\/chamilo\/(app|web|main\/default_course_document\/images|main\/lang)(\/.*)?'\nsudo restorecon -Rv \/var\/www\/chamilo<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Configure the Chamilo Nginx server block<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Chamilo&#8217;s course, SCORM, document, and badge URLs need explicit rewrites; a basic <code>try_files<\/code> rule alone often produces 404 errors after login. Create the HTTP server block below and replace <code>YOUR_DOMAIN<\/code> in the <code>server_name<\/code> line.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo tee \/etc\/nginx\/conf.d\/chamilo.conf &gt; \/dev\/null &lt;&lt;'NGINX'\nserver {\n    listen 80;\n    listen [::]:80;\n    server_name YOUR_DOMAIN;\n\n    root \/var\/www\/chamilo;\n    index index.php;\n    charset utf-8;\n    client_max_body_size 100m;\n    autoindex off;\n\n    location @chamilo_routes {\n        rewrite ^\/certificates\/$ \/certificates\/index.php last;\n        rewrite ^\/courses\/([^\/]+)\/$ \/main\/course_home\/course_home.php?cDir=$1 last;\n        rewrite ^\/courses\/([^\/]+)\/index.php$ \/main\/course_home\/course_home.php?cDir=$1 last;\n        rewrite ^\/courses\/([^\/]+)\/scorm\/(.*\\.(js|css|png|jpg|jpeg|gif))$ \/app\/courses\/$1\/scorm\/$2 last;\n        rewrite ^\/courses\/([^\/]+)\/scorm\/(.*)$ \/main\/document\/download_scorm.php?doc_url=\/$2&amp;cDir=$1 last;\n        rewrite ^\/courses\/([^\/]+)\/document\/certificates\/(.*)$ \/app\/courses\/$1\/document\/certificates\/$2 last;\n        rewrite ^\/courses\/([^\/]+)\/document\/(.*)$ \/main\/document\/download.php?doc_url=\/$2&amp;cDir=$1 last;\n        rewrite ^\/courses\/([^\/]+)\/upload\/([^\/]+)\/(.*)$ \/main\/document\/download_uploaded_files.php?code=$1&amp;type=$2&amp;file=$3 last;\n        rewrite ^\/courses\/([^\/]+)\/work\/(.*)$ \/main\/work\/download.php?file=work\/$2&amp;cDir=$1 last;\n        rewrite ^\/courses\/([^\/]+)\/upload\/course_home_icons\/(.*\\.(png|jpg|jpeg|gif))$ \/app\/courses\/$1\/upload\/course_home_icons\/$2 last;\n        rewrite ^\/courses\/([^\/]+)\/(.*)$ \/app\/courses\/$1\/$2 last;\n        rewrite ^\/session\/(\\d+)\/about\/?$ \/main\/session\/about.php?session_id=$1 last;\n        rewrite ^\/course\/(\\d+)\/about\/?$ \/main\/course_info\/about.php?course_id=$1 last;\n        rewrite ^\/badge\/(\\d+) \/main\/badge\/issued.php?issue=$1 last;\n        rewrite ^\/skill\/(\\d+)\/user\/(\\d+) \/main\/badge\/issued_all.php?skill=$1&amp;user=$2 last;\n        rewrite ^\/badge\/(\\d+)\/user\/(\\d+) \/main\/badge\/issued_all.php?skill=$1&amp;user=$2 last;\n        rewrite ^\/main\/exercice\/(.*)$ \/main\/exercise\/$1 last;\n        rewrite ^\/main\/newscorm\/(.*)$ \/main\/lp\/$1 last;\n        rewrite ^\/service\/(\\d+)$ \/plugin\/buycourses\/src\/service_information.php?service_id=$1 last;\n        rewrite ^\/main\/upload\/users\/(.*)\/(.*)\/my_files\/(.*)$ \/app\/upload\/users\/$1\/$2\/my_files\/$3 last;\n        try_files $uri \/index.php$is_args$args;\n    }\n\n    location \/ {\n        try_files $uri @chamilo_routes;\n    }\n\n    location \/main {\n        rewrite ^\/main\/([^\/]+)\/?$ \/main\/$1\/index.php last;\n    }\n\n    location ~ \\.php$ {\n        try_files $uri @chamilo_routes;\n        include fastcgi_params;\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n        fastcgi_param HTTPS $https;\n        fastcgi_pass unix:\/run\/php-fpm\/www.sock;\n    }\n\n    location ~* \\.(png|jpe?g|gif|ico|js|css|mp3|swf|flv|mp4|ogg|woff|woff2)$ {\n        rewrite ^\/courses\/([^\/]+)\/course-pic85x85.png$ \/app\/courses\/$1\/course-pic85x85.png last;\n        rewrite ^\/courses\/([^\/]+)\/course-pic.png$ \/app\/courses\/$1\/course-pic.png last;\n        rewrite ^\/courses\/([^\/]+)\/scorm\/(.*)$ \/main\/document\/download_scorm.php?doc_url=\/$2&amp;cDir=$1 last;\n        rewrite ^\/courses\/([^\/]+)\/document\/(.*)$ \/main\/document\/download.php?doc_url=\/$2&amp;cDir=$1 last;\n        rewrite ^\/courses\/([^\/]+)\/work\/(.*)$ \/main\/work\/download.php?file=work\/$2&amp;cDir=$1 last;\n        rewrite ^\/courses\/([^\/]+)\/upload\/(.*)$ \/app\/courses\/$1\/upload\/$2 last;\n        rewrite ^\/courses\/(.*)$ \/app\/courses\/$1 break;\n        expires 30d;\n        access_log off;\n        try_files $uri @chamilo_routes;\n    }\n\n    location ^~ \/app\/config\/ { deny all; }\n    location ^~ \/vendor\/ { deny all; }\n    location ^~ \/tests\/ { deny all; }\n    location ^~ \/main\/inc\/lib\/javascript\/bigupload\/files\/ { deny all; }\n    location ~ \/\\. { deny all; }\n    location ~* \/web\\.config$ { deny all; }\n}\nNGINX\nsudo nginx -t\nsudo systemctl reload nginx<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nginx should print <code>syntax is ok<\/code> and <code>test is successful<\/code>. Keep the document root at <code>\/var\/www\/chamilo<\/code>; the rewrite targets assume that exact path.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nginx: the configuration file \/etc\/nginx\/nginx.conf syntax is ok\nnginx: configuration file \/etc\/nginx\/nginx.conf test is successful<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Open the firewall and enable HTTPS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Allow only the services needed for administration, certificate validation, and normal web traffic. Certbot can then add the TLS listener and redirect HTTP requests without exposing MariaDB.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo firewall-cmd --permanent --zone=public --add-service=ssh\nsudo firewall-cmd --permanent --zone=public --add-service=http\nsudo firewall-cmd --permanent --zone=public --add-service=https\nsudo firewall-cmd --reload\nsudo firewall-cmd --list-services\nsudo dnf install -y certbot python3-certbot-nginx\nsudo certbot --nginx --redirect --agree-tos --no-eff-email -m YOUR_EMAIL -d YOUR_DOMAIN\nsudo nginx -t<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The service list should contain <code>ssh<\/code>, <code>http<\/code>, and <code>https<\/code>. The certificate request will fail unless <code>YOUR_DOMAIN<\/code> resolves publicly to this VPS and port 80 is reachable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6: Run the Chamilo browser installer<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The web installer writes the portal configuration and creates the first administrator, so this is where the database values become part of the application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open <code>https:\/\/YOUR_DOMAIN\/main\/install\/index.php<\/code> and enter these values when asked:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Database type: MySQL or MariaDB<\/li>\n\n\n<li>Database host: <code>localhost<\/code><\/li>\n\n\n<li>Database port: <code>3306<\/code><\/li>\n\n\n<li>Database name: <code>chamilo<\/code><\/li>\n\n\n<li>Database user: <code>chamilo_user<\/code><\/li>\n\n\n<li>Database password: the value used for <code>YOUR_DB_PASSWORD<\/code><\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Choose the portal language, set a unique administrator password, and finish the wizard. If it reports a write error, fix ownership and SELinux labels from Step 3 before continuing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After the dashboard loads, make the generated configuration readable but no longer writable by the web process:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chown -R root:nginx \/var\/www\/chamilo\/app\/config\nsudo find \/var\/www\/chamilo\/app\/config -type d -exec chmod 0750 {} \\;\nsudo find \/var\/www\/chamilo\/app\/config -type f -exec chmod 0640 {} \\;\nsudo rm -f \/tmp\/chamilo-1.11.40.zip<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Verify the Chamilo installation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check the services and required PHP modules from SSH, then sign in over HTTPS and create a small course with one uploaded document. That last browser test exercises the rewrites, database connection, TLS, and writable paths together.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl is-active nginx php-fpm mariadb firewalld\nsudo nginx -t\nphp -v | head -n 1\nphp -m | grep -E 'curl|gd|intl|mbstring|mysqli|PDO|soap|xml|zip'\ncurl -fsSI https:\/\/YOUR_DOMAIN\/<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>active\nactive\nactive\nactive\nsyntax is ok\ntest is successful\nPHP 8.3.x (cli) ...\nHTTP\/2 200<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The module order can differ, and a redirect status is also normal if the portal sends unauthenticated visitors to its login page. A successful login and course-file upload are the meaningful application checks.<\/p>\n\n\n\n<aside class=\"vl-element vl-cta-banner\" aria-label=\"Host Chamilo LMS\">\n\t<div class=\"vl-cta-banner__content\">\n\t\t<p class=\"vl-cta-banner__eyebrow\">Rocky Linux VPS<\/p>\n\t\t<h3 class=\"vl-cta-banner__title\">Host Chamilo LMS<\/h3>\n\t\t<p class=\"vl-cta-banner__text\">Deploy a secure Chamilo learning portal with Nginx, MariaDB, PHP, and HTTPS.<\/p>\n\t<\/div>\n\t<a class=\"vl-cta-banner__button\" href=\"\/buy-vps\" aria-label=\"View Linux VPS plans\">View Linux VPS plans<\/a>\n<\/aside>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><code>No matching module streams for php:remi-8.3<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Remi release package is missing, or DNF has stale module metadata. Reinstall the EL8 repository package, reset the PHP module, and enable the stream again.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo dnf clean all\nsudo dnf install -y https:\/\/rpms.remirepo.net\/enterprise\/remi-release-8.rpm\nsudo dnf module reset php -y\nsudo dnf module enable php:remi-8.3 -y\nsudo dnf install -y php php-fpm<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Nginx returns <code>502 Bad Gateway<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The PHP-FPM service may be stopped, or Nginx may be pointing at a socket that does not exist. Confirm the socket and restart the pool before checking the Nginx error log.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl status php-fpm --no-pager\nsudo ls -l \/run\/php-fpm\/www.sock\nsudo systemctl restart php-fpm nginx\nsudo tail -n 30 \/var\/log\/nginx\/error.log<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">The installer says <code>Permission denied<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Chamilo needs write access to its configuration and upload locations, while SELinux must also label those paths as writable. Reapply the ownership and context commands from Step 3, then restart PHP-FPM.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chown -R nginx:nginx \/var\/www\/chamilo\/app \/var\/www\/chamilo\/web \/var\/www\/chamilo\/main\/default_course_document\/images \/var\/www\/chamilo\/main\/lang\nsudo restorecon -Rv \/var\/www\/chamilo\nsudo systemctl restart php-fpm<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Courses or document downloads return <code>404 Not Found<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This usually means the request is reaching a different Nginx server block or the Chamilo route block was edited incorrectly. Check the active configuration for the domain and reload only after the syntax test passes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nginx -T | grep -A3 -B2 'server_name YOUR_DOMAIN'\nsudo nginx -t\nsudo systemctl reload nginx<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Hardening and maintenance<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Back up the <code>chamilo<\/code> database and <code>\/var\/www\/chamilo<\/code> before updating the application; course uploads are part of the site data.<\/li>\n\n\n<li>Keep SELinux enforcing and leave <code>\/var\/www\/chamilo\/app\/config<\/code> owned by <code>root:nginx<\/code> after the installer has finished.<\/li>\n\n\n<li>Test certificate renewal with <code>sudo certbot renew --dry-run<\/code> and keep the server packages updated with <code>sudo dnf update<\/code>.<\/li>\n\n\n<li>Restrict SSH to key-based administrator access where possible, and do not open MariaDB&#8217;s port to the public internet.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Why use PHP 8.3 on Rocky Linux 8?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Rocky Linux 8&#8217;s base PHP stream can be older than the supported target for the 1.11 branch. The Remi 8.3 stream provides the PHP runtime and matching extensions without mixing individual packages from unrelated repositories.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I use an IP address instead of a domain?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can use an IP for a short local test, but the HTTPS command in this guide expects a DNS name that Certbot can validate. Use a domain for a public learning portal and keep the certificate renewal process working.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Does MariaDB need port 3306 open?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No. The Chamilo database account is restricted to <code>localhost<\/code>, and PHP-FPM connects locally. Leaving port 3306 closed prevents outside clients from reaching MariaDB.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What should I back up for a Chamilo migration?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Back up the <code>chamilo<\/code> database and the application directory, especially uploaded course content and <code>\/var\/www\/chamilo\/app\/config<\/code>. Restore the database and files together so course records do not point to missing uploads.<\/p>\n\n\n\n<script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"FAQPage\", \"mainEntity\": [{\"@type\": \"Question\", \"name\": \"Why use PHP 8.3 on Rocky Linux 8?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Rocky Linux 8's base PHP stream can be older than the supported target for the 1.11 branch. The Remi 8.3 stream provides the PHP runtime and matching extensions without mixing individual packages from unrelated repositories.\"}}, {\"@type\": \"Question\", \"name\": \"Can I use an IP address instead of a domain?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"You can use an IP for a short local test, but the HTTPS command in this guide expects a DNS name that Certbot can validate. Use a domain for a public learning portal and keep the certificate renewal process working.\"}}, {\"@type\": \"Question\", \"name\": \"Does MariaDB need port 3306 open?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"No. The Chamilo database account is restricted to `localhost`, and PHP-FPM connects locally. Leaving port 3306 closed prevents outside clients from reaching MariaDB.\"}}, {\"@type\": \"Question\", \"name\": \"What should I back up for a Chamilo migration?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Back up the `chamilo` database and the application directory, especially uploaded course content and `\/var\/www\/chamilo\/app\/config`. Restore the database and files together so course records do not point to missing uploads.\"}}]}<\/script>\n\n","protected":false},"excerpt":{"rendered":"Install Chamilo with LEMP Stack on Rocky Linux 8 using PHP 8.3, MariaDB, Nginx, SELinux-safe permissions, HTTPS, and Chamilo 1.11.40 for a secure portal.","protected":false},"author":1,"featured_media":1032,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_singular_sidebar":"","csco_page_header_type":"","csco_page_load_nextpost":"","footnotes":""},"categories":[5,9],"tags":[130,131,124,125,105],"class_list":["post-1031","post","type-post","status-publish","format-standard","has-post-thumbnail","category-guides","category-vps-hosting","tag-chamilo","tag-elearning","tag-lemp","tag-nginx","tag-rocky-linux-8","cs-entry"],"_links":{"self":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/1031","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/comments?post=1031"}],"version-history":[{"count":1,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/1031\/revisions"}],"predecessor-version":[{"id":3935,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/1031\/revisions\/3935"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/media\/1032"}],"wp:attachment":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/media?parent=1031"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/categories?post=1031"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/tags?post=1031"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}