{"id":1039,"date":"2026-11-09T03:00:00","date_gmt":"2026-11-09T03:00:00","guid":{"rendered":"https:\/\/vpslake.com\/blog\/?p=1039"},"modified":"2026-11-09T03:00:00","modified_gmt":"2026-11-09T03:00:00","slug":"install-craft-cms-lemp-rocky-linux-8","status":"publish","type":"post","link":"https:\/\/vpslake.com\/blog\/2026\/11\/09\/install-craft-cms-lemp-rocky-linux-8\/","title":{"rendered":"How to Install Craft CMS with LEMP on Rocky Linux 8"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Install Craft CMS with LEMP Stack on Rocky Linux 8 by combining Nginx, PHP-FPM, MySQL 8.4, and Composer on a clean VPS. You will finish with a TLS-protected Craft control panel and a public <code>web\/<\/code> document root in about 15\u201320 minutes, assuming DNS already points to the server.<\/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, fully updated, with 2 vCPUs, at least 2 GB of RAM, and 10 GB of free disk space.<\/li>\n\n\n<li>A root account or sudo-enabled user connected over SSH. The commands below use <code>sudo<\/code>.<\/li>\n\n\n<li>A domain such as <code>YOUR_DOMAIN<\/code> with an A record pointing to the VPS. Ports 80 and 443 must be reachable during certificate issuance.<\/li>\n\n\n<li>A unique MySQL password, a Craft administrator password, and an email address for Let\u2019s Encrypt notices.<\/li>\n\n\n<li>A <a href=\"https:\/\/vpslake.com\/buy-vps\">VPSLake Linux VPS<\/a> with a public IPv4 address is suitable for this LEMP stack.<\/li>\n\n\n<li>Do not run Apache or another service on ports 80 and 443; Nginx will own those ports.<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Craft 5 needs PHP 8.2 or newer, Composer 2, and MySQL 8.0.17 or newer. This guide uses PHP 8.3 from Remi and MySQL 8.4 LTS; review Craft\u2019s <a href=\"https:\/\/craftcms.com\/docs\/5.x\/requirements\" target=\"_blank\" rel=\"noopener\">official requirements<\/a> if you plan to add demanding plugins or a large content library.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Install the LEMP packages<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Rocky Linux 8\u2019s default PHP stream can be too old for a new Craft project, so enable the Remi PHP 8.3 stream and MySQL\u2019s EL8 repository before installing the services.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo dnf update -y\nsudo dnf install -y epel-release firewalld nginx curl unzip tar policycoreutils-python-utils\nsudo dnf module disable -y mysql\nsudo dnf install -y https:\/\/dev.mysql.com\/get\/mysql84-community-release-el8-3.noarch.rpm\nsudo dnf install -y mysql-community-server\nsudo dnf install -y https:\/\/rpms.remirepo.net\/enterprise\/remi-release-8.rpm\nsudo dnf module reset -y php\nsudo dnf module enable -y php:remi-8.3\nsudo dnf install -y php php-bcmath php-cli php-common php-curl php-fpm php-gd php-intl php-mbstring php-mysqlnd php-opcache php-process 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 = 512M\/; s\/^upload_max_filesize = .*\/upload_max_filesize = 64M\/; s\/^post_max_size = .*\/post_max_size = 64M\/; s\/^max_execution_time = .*\/max_execution_time = 120\/' \/etc\/php.ini\nsudo systemctl enable --now firewalld mysqld nginx php-fpm<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The PHP-FPM pool runs as <code>nginx<\/code>, while MySQL remains bound for local application use. Check the versions before continuing:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php -v\nmysql --version\nnginx -v<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>PHP 8.3.x (cli)\nmysql  Ver 8.4.x\nnginx version: nginx\/1.x<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Run the interactive hardening wizard once, because a fresh MySQL installation has a temporary root password and default settings that should not remain on an internet-facing VPS.<\/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\">Choose a strong root password, remove anonymous users, disable remote root login, remove the test database, and reload the privilege tables when prompted. You will use a separate application account in the next step.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Create a private MySQL database<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Craft needs a database account with schema privileges, but it does not need MySQL exposed to the public network.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mysql -u root -p<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">At the <code>mysql&gt;<\/code> prompt, run the following SQL. Replace <code>YOUR_DB_PASSWORD<\/code> with a long, unique password before submitting it.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE DATABASE craftcms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nCREATE USER 'craft_user'@'localhost' IDENTIFIED BY 'YOUR_DB_PASSWORD';\nGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP, REFERENCES, LOCK TABLES ON craftcms.* TO 'craft_user'@'localhost';\nFLUSH PRIVILEGES;\nEXIT;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Confirm that the schema exists without opening port 3306:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mysql -u root -p -e \"SHOW DATABASES LIKE 'craftcms';\"<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>Database (craftcms)\ncraftcms<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Install Composer and create the Craft project<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Composer starter creates the current Craft application layout. Keeping the project above Nginx\u2019s public root prevents visitors from requesting <code>.env<\/code>, <code>config<\/code>, or <code>vendor<\/code> files.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Install Composer 2 with its published checksum, then create the project at <code>\/var\/www\/craft<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>set -eu\nsudo curl -fsSL https:\/\/getcomposer.org\/installer -o \/tmp\/composer-setup.php\nEXPECTED_CHECKSUM=\"$(curl -fsSL https:\/\/composer.github.io\/installer.sig)\"\nACTUAL_CHECKSUM=\"$(php -r \"echo hash_file('sha384', '\/tmp\/composer-setup.php');\")\"\ntest \"$EXPECTED_CHECKSUM\" = \"$ACTUAL_CHECKSUM\"\nsudo php \/tmp\/composer-setup.php --install-dir=\/usr\/local\/bin --filename=composer\nrm -f \/tmp\/composer-setup.php\nsudo env COMPOSER_ALLOW_SUPERUSER=1 composer create-project craftcms\/craft \/var\/www\/craft --no-scripts<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Create the environment file and the directories Craft must write during installation. Replace both placeholders in this block with the values you chose earlier.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo install -d -o root -g nginx -m 0770 \/var\/www\/craft\/storage \/var\/www\/craft\/config\/project \/var\/www\/craft\/web\/cpresources\nsudo install -o root -g nginx -m 0660 \/dev\/null \/var\/www\/craft\/.env\nsudo tee \/var\/www\/craft\/.env &gt; \/dev\/null &lt;&lt;'ENV'\nCRAFT_APP_ID=\nCRAFT_SECURITY_KEY=\nCRAFT_ENVIRONMENT=production\nPRIMARY_SITE_URL=\"https:\/\/YOUR_DOMAIN\/\"\nCRAFT_DB_DRIVER=mysql\nCRAFT_DB_SERVER=localhost\nCRAFT_DB_PORT=3306\nCRAFT_DB_DATABASE=craftcms\nCRAFT_DB_USER=craft_user\nCRAFT_DB_PASSWORD=\"YOUR_DB_PASSWORD\"\nCRAFT_DB_SCHEMA=\nCRAFT_DB_TABLE_PREFIX=\nENV\nsudo chown -R root:nginx \/var\/www\/craft\nsudo find \/var\/www\/craft -type d -exec chmod 0750 {} \\;\nsudo find \/var\/www\/craft -type f -exec chmod 0640 {} \\;\nsudo chmod 0660 \/var\/www\/craft\/.env\nsudo chmod 0770 \/var\/www\/craft\/config \/var\/www\/craft\/config\/project \/var\/www\/craft\/storage \/var\/www\/craft\/web\/cpresources<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Replace <code>YOUR_DOMAIN<\/code> and <code>YOUR_DB_PASSWORD<\/code>; do not leave either placeholder in the live file. Generate Craft\u2019s application ID and security key as the same account that PHP-FPM uses:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/var\/www\/craft\nsudo -u nginx env HOME=\/var\/lib\/nginx php craft setup\/app-id\nsudo -u nginx env HOME=\/var\/lib\/nginx php craft setup\/security-key<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Each command should finish successfully and write its value into <code>.env<\/code>. These permissions avoid world-writable files and leave SELinux enabled.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Apply SELinux labels for Craft<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">SELinux permits Nginx to read the project by default, but Craft needs write access to its storage, project configuration, and control-panel resources.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo semanage fcontext -a -t httpd_sys_content_t '\/var\/www\/craft(\/.*)?'\nsudo semanage fcontext -a -t httpd_sys_rw_content_t '\/var\/www\/craft\/(config|storage|web\/cpresources)(\/.*)?'\nsudo restorecon -Rv \/var\/www\/craft<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The final command should list restored paths without AVC denial errors. The writable context applies only to the directories Craft documents as runtime storage.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Configure Nginx for the Craft web root<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Craft\u2019s front controller handles clean URLs, so Nginx must serve <code>\/var\/www\/craft\/web<\/code> and route unknown paths to <code>index.php<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo tee \/etc\/nginx\/conf.d\/craft.conf &gt; \/dev\/null &lt;&lt;'NGINX'\nserver {\n    listen 80;\n    listen [::]:80;\n    server_name YOUR_DOMAIN;\n\n    root \/var\/www\/craft\/web;\n    index index.php;\n    client_max_body_size 64m;\n\n    location \/ {\n        try_files $uri $uri\/ \/index.php?$query_string;\n    }\n\n    location ~ \\.php$ {\n        try_files $fastcgi_script_name =404;\n        include fastcgi_params;\n        fastcgi_param HTTP_PROXY \"\";\n        fastcgi_param DOCUMENT_ROOT $realpath_root;\n        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;\n        fastcgi_pass unix:\/run\/php-fpm\/www.sock;\n    }\n\n    location ~ \/\\.(?!well-known) {\n        deny all;\n    }\n}\nNGINX\nsudo nginx -t\nsudo systemctl reload nginx<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Change <code>YOUR_DOMAIN<\/code> before running the block. The configuration test should report <code>syntax is ok<\/code> and <code>test is successful<\/code>; Nginx will not reload an invalid file.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6: Open web ports and enable HTTPS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Allow SSH plus the two web services through Rocky\u2019s firewalld, then let Certbot add the TLS configuration and redirect HTTP traffic.<\/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 dnf install -y certbot python3-certbot-nginx\nsudo certbot --nginx --redirect --agree-tos --no-eff-email -m YOUR_EMAIL -d YOUR_DOMAIN<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Replace <code>YOUR_EMAIL<\/code> with an address you monitor. The domain must already resolve to this server, and port 80 must be reachable while Certbot validates it. A successful run reports the certificate location and an HTTPS redirect.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 7: Run the Craft web installer<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The browser installer completes the database migrations and creates the first administrator after the server-side project is ready.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open <code>https:\/\/YOUR_DOMAIN\/admin\/install<\/code> and enter these database values if Craft asks for them:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Database: <code>craftcms<\/code><\/li>\n\n\n<li>User: <code>craft_user<\/code><\/li>\n\n\n<li>Server: <code>localhost<\/code><\/li>\n\n\n<li>Port: <code>3306<\/code><\/li>\n\n\n<li>Password: the value used for <code>YOUR_DB_PASSWORD<\/code><\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Create a separate administrator password and store it in a password manager. For the reasoning behind a separate <code>web\/<\/code> document root and the Nginx pattern above, see Craft\u2019s <a href=\"https:\/\/craftcms.com\/knowledge-base\/setting-up-a-server-for-craft\" target=\"_blank\" rel=\"noopener\">server setup guidance<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Verify the Craft installation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check the service states, PHP extensions, Nginx syntax, Craft installation status, and HTTPS response from SSH. Then sign in at <code>https:\/\/YOUR_DOMAIN\/admin<\/code> and load the site\u2019s front page.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl is-active nginx php-fpm mysqld firewalld\nsudo nginx -t\nphp -m | grep -E 'bcmath|curl|gd|intl|mbstring|mysqli|PDO|xml|zip'\ncd \/var\/www\/craft\nsudo -u nginx env HOME=\/var\/lib\/nginx php craft install\/check\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\nHTTP\/2 200<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The extension list can appear in a different order, and the first request may redirect to the control panel. A successful Craft login and a rendered front page confirm the complete stack.<\/p>\n\n\n\n<aside class=\"vl-element vl-cta-banner\" aria-label=\"Host Craft CMS securely\">\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 Craft CMS securely<\/h3>\n\t\t<p class=\"vl-cta-banner__text\">Deploy Craft CMS with Nginx, PHP, MySQL, and HTTPS on a Rocky Linux VPS.<\/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>502 Bad Gateway<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nginx cannot reach PHP-FPM when the service is stopped or the pool socket is not readable by Nginx. Check the socket and restart both services:<\/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<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If the socket path differs, use the <code>listen =<\/code> value in <code>\/etc\/php-fpm.d\/www.conf<\/code> in the <code>fastcgi_pass<\/code> directive.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>SQLSTATE[HY000] [1045] Access denied<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The password in <code>.env<\/code> does not match the <code>craft_user<\/code> account, or the account was created for a different host. Run <code>sudo mysql -u root -p -e \"SELECT User,Host FROM mysql.user WHERE User='craft_user';\"<\/code>; the host should be <code>localhost<\/code>, then update the password in <code>.env<\/code> to match.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>403 Forbidden<\/code> or permission denied during setup<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Check the Unix group and SELinux labels instead of loosening permissions. Run <code>sudo restorecon -Rv \/var\/www\/craft<\/code>, confirm that <code>storage<\/code>, <code>config\/project<\/code>, and <code>web\/cpresources<\/code> are group-writable by <code>nginx<\/code>, and verify that Nginx\u2019s root is exactly <code>\/var\/www\/craft\/web<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Certbot says the challenge failed<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The DNS record may still point elsewhere, or an upstream VPS firewall may block port 80. Confirm <code>dig +short YOUR_DOMAIN<\/code> returns the VPS address, allow HTTP in the VPS control panel, and run Certbot again after DNS propagation.<\/p>\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>Keep MySQL private: do not add a firewalld rule for port 3306, and use an SSH tunnel for remote database administration.<\/li>\n\n\n<li>Back up the database, <code>storage<\/code>, and uploaded assets before Craft or Composer updates.<\/li>\n\n\n<li>Test renewal with <code>sudo certbot renew --dry-run<\/code> and keep the renewal timer enabled.<\/li>\n\n\n<li>Update the host with <code>sudo dnf update -y<\/code>; review Craft and plugin changes before applying them to production.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ<\/h2>\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 the VPS IP for an initial test, but a domain is the right choice for a public Craft site. The HTTPS step relies on DNS validation, and <code>PRIMARY_SITE_URL<\/code> should match the hostname visitors will use.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why does this guide use MySQL instead of MariaDB?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Both database families meet Craft\u2019s minimum requirements, but Craft currently recommends MySQL for sites with many users or a large amount of content. MySQL 8.4 also gives this Rocky Linux 8 setup a maintained LTS series with an official EL8 repository.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Which Craft files need write access?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">At runtime, PHP needs to write to <code>storage<\/code>, <code>config\/license.key<\/code>, and <code>web\/cpresources<\/code>. The guide grants the Nginx group access to those locations while keeping the rest of the project outside the public root.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How should I update Craft later?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Take a database and file backup, run Composer from <code>\/var\/www\/craft<\/code>, and use <code>php craft up<\/code> to apply migrations and project configuration changes. Perform updates in a maintenance window and check plugin compatibility before upgrading the CMS core.<\/p>\n\n\n\n<script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"FAQPage\", \"mainEntity\": [{\"@type\": \"Question\", \"name\": \"Can I use an IP address instead of a domain?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"You can use the VPS IP for an initial test, but a domain is the right choice for a public Craft site. The HTTPS step relies on DNS validation, and `PRIMARY_SITE_URL` should match the hostname visitors will use.\"}}, {\"@type\": \"Question\", \"name\": \"Why does this guide use MySQL instead of MariaDB?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Both database families meet Craft\u2019s minimum requirements, but Craft currently recommends MySQL for sites with many users or a large amount of content. MySQL 8.4 also gives this Rocky Linux 8 setup a maintained LTS series with an official EL8 repository.\"}}, {\"@type\": \"Question\", \"name\": \"Which Craft files need write access?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"At runtime, PHP needs to write to `storage`, `config\/license.key`, and `web\/cpresources`. The guide grants the Nginx group access to those locations while keeping the rest of the project outside the public root.\"}}, {\"@type\": \"Question\", \"name\": \"How should I update Craft later?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Take a database and file backup, run Composer from `\/var\/www\/craft`, and use `php craft up` to apply migrations and project configuration changes. Perform updates in a maintenance window and check plugin compatibility before upgrading the CMS core.\"}}]}<\/script>\n\n","protected":false},"excerpt":{"rendered":"Install Craft CMS with LEMP Stack on Rocky Linux 8 using PHP 8.3, Nginx, MySQL 8.4, Composer, SELinux-safe permissions, and HTTPS on a fresh VPS.","protected":false},"author":1,"featured_media":1040,"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":[136,124,125,72,105],"class_list":["post-1039","post","type-post","status-publish","format-standard","has-post-thumbnail","category-guides","category-vps-hosting","tag-craft-cms","tag-lemp","tag-nginx","tag-php","tag-rocky-linux-8","cs-entry"],"_links":{"self":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/1039","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=1039"}],"version-history":[{"count":1,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/1039\/revisions"}],"predecessor-version":[{"id":3949,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/1039\/revisions\/3949"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/media\/1040"}],"wp:attachment":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/media?parent=1039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/categories?post=1039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/tags?post=1039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}