{"id":61,"date":"2024-02-28T05:40:22","date_gmt":"2024-02-28T05:40:22","guid":{"rendered":"https:\/\/blog.devops955.com\/swain\/?p=61"},"modified":"2024-03-06T07:13:05","modified_gmt":"2024-03-06T07:13:05","slug":"step-by-step-guide-to-deploying-wordpress-with-lemp-stack","status":"publish","type":"post","link":"https:\/\/blog.devops955.com\/swain\/2024\/02\/28\/step-by-step-guide-to-deploying-wordpress-with-lemp-stack\/","title":{"rendered":"Step-by-Step Guide to Deploying WordPress with LEMP Stack"},"content":{"rendered":"<blockquote>\n<p>Estimated reading time: 15 min<\/p>\n<\/blockquote>\n<h1>Introduction<\/h1>\n<p>This note documents the process of deploying a WordPress website using the <strong>LEMP<\/strong> stack. Before we start, let's briefly understand what LEMP and WordPress are.<\/p>\n<p><strong>LEMP<\/strong> is an acronym that stands for <strong>Linux<\/strong>, <strong>Nginx<\/strong> (pronounced &quot;Engine-X&quot;), <strong>MySQL\/MariaDB<\/strong>, and <strong>PHP<\/strong>. It is a powerful and efficient software stack. Of course, another popular stack is the LAMP stack, which replaces Nginx with <strong>Apache<\/strong>, but I went directly with Nginx due to limited resources.<\/p>\n<p>In this deployment, we are using <strong>Ubuntu 20.04<\/strong> as the server operating system. We set up a blog site by building LEMP and then installing WordPress.<\/p>\n<p><strong>WordPress<\/strong> is the world's most popular content management system (CMS). It allows users to create, manage, and publish content online without advanced technical skills. WordPress is known for its simplicity, flexibility, and vast ecosystem of themes and plugins. There are also other options, such as Ghost, or direct hosting on Github.<\/p>\n<p>In this guide, I will walk you through my process of setting up a WordPress site on the LEMP stack and try to avoid potential problems as much as possible.<\/p>\n<p>Let's get started!<\/p>\n<h1>Installing and Configuring the LEMP Stack<\/h1>\n<p>Before we install WordPress, we need to set up the LEMP stack on our Linux server. Here, I'm skipping over the installation and configuration of Ubuntu, assuming you already have an Ubuntu 20.04 server set up.<\/p>\n<h2>Installing and configuring Nginx<\/h2>\n<p>To install <strong>Nginx<\/strong> on <strong>Ubuntu 20.04<\/strong>, follow these steps:<\/p>\n<ol>\n<li>\n<p>Open your terminal or connect to your server via SSH.<\/p>\n<\/li>\n<li>\n<p>Update the package lists to ensure you get the latest version of the software by running the following command:<\/p>\n<pre><code class=\"language-bash\">sudo apt update<\/code><\/pre>\n<\/li>\n<li>\n<p>Install Nginx by running the following command:<\/p>\n<pre><code class=\"language-bash\">sudo apt install nginx<\/code><\/pre>\n<\/li>\n<li>\n<p>Once the installation is complete, you can check the status of Nginx to ensure it is running:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl status nginx<\/code><\/pre>\n<p>If Nginx is not running, you can start it with:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl start nginx<\/code><\/pre>\n<p>And don't forget to ensure Nginx starts automatically upon server reboot:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl is-enabled nginx<\/code><\/pre>\n<p>If not, enable it using the following command:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl enable nginx<\/code><\/pre>\n<\/li>\n<li>\n<p>You can now test if Nginx is properly installed and running by navigating to your server's IP address in a web browser. You should see the default Nginx welcome page.<\/p>\n<\/li>\n<\/ol>\n<blockquote>\n<p>Note: Don't forget to configure the firewall to ensure incoming traffic can access your server normally. While Ubuntu commonly uses UFW (Uncomplicated Firewall), I am more familiar with iptables, so I'll provide the firewall rules using iptables as an example. To allow HTTP traffic on port 80, which is what Nginx uses by default, you can add a rule to iptables by executing the following command:<\/p>\n<pre><code class=\"language-bash\">sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT<\/code><\/pre>\n<p>This command tells the firewall to accept incoming TCP traffic on port 80, which is necessary for accessing the Nginx server through a web browser.<\/p>\n<\/blockquote>\n<ol start=\"6\">\n<li>\n<p>Configure Nginx to serve your WordPress site. To do this, you'll need to create a new virtual host configuration file in the <em>\/etc\/nginx\/sites-available<\/em> directory.<\/p>\n<pre><code class=\"language-bash\">cd \/etc\/nginx\/sites-available\/<\/code><\/pre>\n<\/li>\n<li>\n<p>Create a new configuration file for your WordPress site. Replace <em>blog.your_domain<\/em> with your actual domain name:<\/p>\n<pre><code class=\"language-bash\">sudo vim blog.your_domain.conf<\/code><\/pre>\n<blockquote>\n<p>This guide assumes familiarity with <strong>vim<\/strong> as a text editor. If not, you might want to use a more straightforward editor like <strong>nano<\/strong> or refer to a basic vim tutorial before proceeding.<\/p>\n<\/blockquote>\n<\/li>\n<li>\n<p>In the new file, add the following server block. This configuration is for a basic WordPress site. Be sure to replace <em>your_domain<\/em> with your actual domain name and <em>\/var\/www\/your_domain<\/em> or <em>\/var\/www\/html\/your_domain<\/em> with the correct path where WordPress will be installed later on:<\/p>\n<pre><code class=\"language-nginx\">server {\nlisten 80;\nserver_name blog.your_domain;\n# Specify the directory where your WordPress is (or will be) installed.\nroot \/var\/www\/blog.your_domain;  \nindex index.php index.html index.htm;\n\nlocation \/ {\n    try_files $uri $uri\/ \/index.php?$args;\n}\n# PHP processing section: Configure the handling of .php files.\nlocation ~ \\.php$ {\n    include snippets\/fastcgi-php.conf;\n    fastcgi_pass unix:\/var\/run\/php\/php7.4-fpm.sock;\n    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n    include fastcgi_params;\n}\n# Security: Deny access to hidden files and directories (those that begin with a dot).\nlocation ~ \/\\.ht {\n    deny all;\n}\n# While Nginx does not use these files, this rule prevents accidental exposure of sensitive information if such files exist. You may use a different set of rules if you prefer.\n#    location ~ \/\\. {\n#    deny all;\n#    }\n\nlocation = \/favicon.ico {\n    log_not_found off;\n    access_log off;\n}\n\nlocation = \/robots.txt {\n    allow all;\n    log_not_found off;\n    access_log off;\n}\n}<\/code><\/pre>\n<\/li>\n<li>\n<p>Save and close the file, then ensure that the nginx.conf includes the configuration <code>include \/etc\/nginx\/sites-enabled\/*;<\/code> to read files from this directory. After that, enable the site by creating a symbolic link of your site's configuration file from <em>sites-available<\/em> to <em>sites-enabled<\/em>.:<\/p>\n<pre><code class=\"language-bash\">sudo ln -s \/etc\/nginx\/sites-available\/blog.your_domain \/etc\/nginx\/sites-enabled\/<\/code><\/pre>\n<\/li>\n<li>\n<p>Test your Nginx configuration to ensure proper syntax.<\/p>\n<pre><code class=\"language-bash\">sudo nginx -t <\/code><\/pre>\n<\/li>\n<li>\n<p>If the test is successful, reload Nginx and apply the changes, otherwise you should first address any reported syntax errors and retest until the configuration is correct:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl reload nginx<\/code><\/pre>\n<blockquote>\n<p>When you use the command <code>sudo systemctl reload nginx<\/code> or <code>sudo nginx -s reload<\/code>, you are instructing Nginx to reload it's configuration files without interrupting ongoing connections (soft reload). This is particularly useful for applying changes smoothly without affecting current visitors to your site.<br \/>\nOn the other hand, using a restart command (such as <code>sudo systemctl restart nginx<\/code>) will completely stop and then start the Nginx service again. This approach can briefly interrupt active connections, making it less suitable for changes that need to be applied without impacting site availability.<br \/>\nFor updates like modifying configuration files, <code>reload<\/code> is usually the preferred method as it updates the configuration without impacting ongoing business or user experience.<\/p>\n<\/blockquote>\n<\/li>\n<\/ol>\n<h2>Installing and configuring Mysql<\/h2>\n<p><strong>MySQL<\/strong> is a popular relational database management system used for storing and managing data. Here we will cover how to install MySQL and perform basic security configurations.<\/p>\n<ol>\n<li>\n<p>Install MySQL server:<\/p>\n<pre><code class=\"language-bash\">sudo apt install mysql-server<\/code><\/pre>\n<\/li>\n<li>\n<p>Once the installation is complete, check if MySQL is running and make sure to enable it to start on boot:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl status mysql\nsudo systemctl is-enabled mysql<\/code><\/pre>\n<p>If not started, run the following command to start it and enable it:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl start mysql\nsudo systemctl enable mysql<\/code><\/pre>\n<\/li>\n<li>\n<p>you can run the security script that comes pre-packaged with MySQL. This script will help you improve the security of your MySQL installation:<\/p>\n<pre><code class=\"language-bash\">sudo mysql_secure_installation<\/code><\/pre>\n<\/li>\n<\/ol>\n<blockquote>\n<p>This script will guide you through several security considerations, including setting up a root password(if not set), removing anonymous users, disabling root login remotely, and removing test databases. It is recommended to accept the defaults which are aimed at increasing the security of your database server.<\/p>\n<\/blockquote>\n<p>Now that MySQL is installed and secured, the next step is to create a database and user for WordPress. WordPress uses a database to manage and store site and user information, so it's essential to set this up before installing WordPress.<\/p>\n<ol start=\"4\">\n<li>\n<p>Log into the MySQL root administrative account by typing:<\/p>\n<pre><code class=\"language-bash\">sudo mysql -u root -p<\/code><\/pre>\n<p>Enter the root password you set before.<\/p>\n<\/li>\n<li>\n<p>Once logged in, create a new database for WordPress. Replace wordpressdb with the name you want to give to your database:<\/p>\n<pre><code class=\"language-SQL\">CREATE DATABASE wordpressdb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;<\/code><\/pre>\n<\/li>\n<li>\n<p>Create a new MySQL user account that will be used exclusively by WordPress. Replace <em>wordpressuser<\/em> with the username you want to use, and <em>password<\/em> with a strong password:<\/p>\n<pre><code class=\"language-SQL\">CREATE USER &#039;wordpressuser&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;password&#039;;<\/code><\/pre>\n<\/li>\n<li>\n<p>Grant the newly created user full privileges on the WordPress database, then flush the MySQL privileges to ensure they are applied and saved:<\/p>\n<pre><code class=\"language-SQL\">GRANT ALL PRIVILEGES ON wordpressdb.* TO &#039;wordpressuser&#039;@&#039;localhost&#039;;\nFLUSH PRIVILEGES;\nEXIT;<\/code><\/pre>\n<p>By completing these steps, you should have successfully created a dedicated database and user for your WordPress installation. These credentials will be used during the WordPress configuration to allow WordPress to connect to the database and store your website's data.<\/p>\n<\/li>\n<\/ol>\n<blockquote>\n<p>Remember to keep the database name, username, and password handy as you will need them when setting up WordPress.<\/p>\n<\/blockquote>\n<h2>Installing and configuring PHP<\/h2>\n<p>WordPress is written in <strong>PHP<\/strong> and requires it to execute its scripts. In this section, we'll install PHP along with some common modules that WordPress needs to function properly.<\/p>\n<ol>\n<li>Install PHP and necessary PHP extensions. On Ubuntu 20.04, you can use the following command to install PHP along with commonly used extensions that WordPress requires:\n<pre><code class=\"language-bash\">sudo apt install php-fpm php-mysql php-gd php-xml php-mbstring php-curl php-xmlrpc php-imagick php-zip -y<\/code><\/pre>\n<\/li>\n<li>Check the PHP version to confirm it's correctly installed:\n<pre><code class=\"language-bash\">php -v<\/code><\/pre>\n<p>You should see the PHP version information displayed, confirming that PHP is successfully installed on your system.<br \/>\nWordPress can usually run well with default PHP settings. However, you can adjust PHP configurations for performance and security in the php.ini file if necessary. But for a standard setup, sticking with the default settings should suffice.<\/p>\n<\/li>\n<li>Make sure PHP-FPM (FastCGI Process Manager) is active and running:\n<pre><code class=\"language-bash\">sudo systemctl status php{version}-fpm<\/code><\/pre>\n<p>Replace {version} with your PHP version. If it's not running, you can start it with:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl start php{version}-fpm<\/code><\/pre>\n<\/li>\n<li>Now, PHP should be set up and ready to support your WordPress installation. It's also important to ensure that PHP-FPM is enabled to start automatically when your server boots up. You can do this with the following command:<\/li>\n<\/ol>\n<pre><code class=\"language-bash\">sudo systemctl enable php{version}-fpm<\/code><\/pre>\n<h1>Installing and configuring WordPress<\/h1>\n<h2>Installing WordPress<\/h2>\n<p>Now that your LEMP stack is fully configured, it's time to install WordPress and get your website up and running.<\/p>\n<ol>\n<li>\n<p>Download WordPress:<br \/>\nFirst, navigate to the root directory of your website. Replace <em>blog.your_domain<\/em> with your actual domain or directory path:<\/p>\n<pre><code class=\"language-bash\">cd \/var\/www\/blog.your_domain<\/code><\/pre>\n<p>Then, use the wget command to download the latest WordPress release:<\/p>\n<pre><code class=\"language-bash\">sudo wget https:\/\/wordpress.org\/latest.tar.gz<\/code><\/pre>\n<p>If you don't have wget, you can simply install it with <code>sudo apt install wget<\/code>. If you have curl, you can also use <strong>curl<\/strong> to complete the download.<\/p>\n<pre><code class=\"language-bash\">sudo curl -O https:\/\/wordpress.org\/latest.tar.gz<\/code><\/pre>\n<\/li>\n<li>\n<p>Extract WordPress:<br \/>\nUnpack the WordPress archive to the current directory, then clean up the temp file and directory.<\/p>\n<pre><code class=\"language-bash\">tar -xzvf latest.tar.gz\nmv wordpress\/* .\/\nrmdir wordpress\nmv latest.tar.gz \/tmp<\/code><\/pre>\n<\/li>\n<li>\n<p>Adujst ownership and permissions:<br \/>\nAdjust the file ownership and permissions to ensure WordPress can function properly. Replace <em>www-data<\/em> with your web server's user if different:<\/p>\n<pre><code class=\"language-bash\">sudo chown -R www-data:www-data \/var\/www\/blog.your_domain<\/code><\/pre>\n<\/li>\n<\/ol>\n<h2>Configuring WordPress<\/h2>\n<ol>\n<li>Set up WordPress:<br \/>\nCopy the WordPress sample configuration file to create a new configuration:<\/p>\n<pre><code class=\"language-bash\">cp wp-config-sample.php wp-config.php<\/code><\/pre>\n<p>Then edit the <em>wp-config.php<\/em> file to add your database connection details.<\/p>\n<pre><code class=\"language-bash\">sudo vim wp-config.php<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>Fill in the database details, such as the name, user, and password, which you created earlier during the MySQL setup steps. Below is an example of how you should modify the <em>wp-config.php<\/em> file with your actual database details:<\/p>\n<pre><code class=\"language-php\">\/** The name of the database for WordPress *\/\ndefine( &#039;DB_NAME&#039;, &#039;wordpressdb&#039; ); \/\/ Replace &#039;wordpressdb&#039; with your actual database name\n\n\/** MySQL database username *\/\ndefine( &#039;DB_USER&#039;, &#039;wordpressuser&#039; ); \/\/ Replace &#039;wordpressuser&#039; with your actual database username\n\n\/** MySQL database password *\/\ndefine( &#039;DB_PASSWORD&#039;, &#039;password&#039; ); \/\/ Replace &#039;password&#039; with your actual database password\n\n\/** MySQL hostname *\/\ndefine( &#039;DB_HOST&#039;, &#039;localhost&#039; ); \/\/ Generally &#039;localhost&#039; but modify if different in your setup\n\n\/** Database charset to use in creating database tables. *\/\ndefine( &#039;DB_CHARSET&#039;, &#039;utf8&#039; ); \/\/ Recommended to leave as &#039;utf8&#039;\n\n\/** The Database Collate type. Don&#039;t change this if in doubt. *\/\ndefine( &#039;DB_COLLATE&#039;, &#039;&#039; ); \/\/ Usually best to leave this empty<\/code><\/pre>\n<ol start=\"2\">\n<li>Almost successfully installed WordPress!<br \/>\nNow, navigate to your website <em><a href=\"http:\/\/blog.your_domain\">http:\/\/blog.your_domain<\/a><\/em> in a web browser. You should see the WordPress installation page. Follow the on-screen instructions to select a language, and fill in the site information and administrator details. After completing these steps, your WordPress website should be installed and ready to use. But before you start posting, you should <strong>secure your website<\/strong>.<\/li>\n<\/ol>\n<h1>Securing Your WordPress Site with HTTPS<\/h1>\n<p>It's crucial in today's web environment to ensure that your website uses HTTPS, the secure version of HTTP. <strong>HTTPS<\/strong> encrypts the data between your user's web browser and your web server, making it more difficult for attackers to intercept and tamper with the data. This is especially important for a site like a WordPress blog, where users may be submitting personal information.<\/p>\n<p>In this guide, we will use a free, automated, and open certificate authority provided by <strong>Let's Encrypt<\/strong>. We'll use <strong>Certbot<\/strong>, a tool designed to simplify the process of obtaining and renewing certificates from Let's Encrypt.<\/p>\n<h2>Installing  and configuring Certbot<\/h2>\n<p><strong>Plan A<\/strong><\/p>\n<p>1a. Install Certbot and its Nginx plugin to make this easier:<\/p>\n<pre><code class=\"language-bash\">sudo apt install certbot python3-certbot-nginx<\/code><\/pre>\n<p>2a. Obtaining a Certificate, you can run it with the --nginx flag to automatically obtain and install a certificate and configure Nginx to use it:<\/p>\n<pre><code class=\"language-bash\">sudo certbot --nginx<\/code><\/pre>\n<p>Follow the prompts to enter your email address, agree to the terms of service, and decide whether you want to redirect HTTP traffic to HTTPS (which is recommended).<\/p>\n<p>If this not work well, you can try mannually apply for the certificate and configure HTTPS on Nginx, you can use the following approach:<\/p>\n<p><strong>Plan B<\/strong><\/p>\n<p>1b. Obtaining a Certificate Manually:<\/p>\n<pre><code class=\"language-bash\">sudo certbot certonly<\/code><\/pre>\n<p>This command will obtain the certificate but will not modify your Nginx configuration. After entering this command, follow the prompts to complete the validation process. You will need to: <\/p>\n<ul>\n<li>Enter your email address.<\/li>\n<li>Agree to the terms of service.<\/li>\n<li>Input your domain name(s) for which you want to obtain the certificate.<\/li>\n<\/ul>\n<blockquote>\n<p>Note: The obtained certificates will be stored by default at <em>\/etc\/letsencrypt\/live\/your_domain\/<\/em>. Remember this path as you will need it for configuring Nginx to use the SSL certificate.<\/p>\n<\/blockquote>\n<p>2b. Configuring Nginx to Use the SSL Certificate<br \/>\nOnce you have your certificate, you need to configure Nginx to use it. First, open your domain's Nginx configuration file:<\/p>\n<pre><code class=\"language-bash\">sudo vim \/etc\/nginx\/sites-available\/blog.your_domain<\/code><\/pre>\n<p>Add the following lines inside the <strong>server block<\/strong> to enable HTTPS, replacing your_domain with your actual domain name:<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 443 ssl http2;\n    server_name blog.your_domain;\n    ssl_certificate \/etc\/letsencrypt\/live\/your_domain\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/your_domain\/privkey.pem;\n\n    # ... (other configuration)\n\n}<\/code><\/pre>\n<p>Don't forget your http server and redirect it to https:<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 80;\n    server_name blod.your_domain;\n    return 301 https:\/\/$server_name$request_uri;\n}<\/code><\/pre>\n<ol start=\"3\">\n<li>\n<p>Testing and Reloading Nginx Configuration<br \/>\nAfter updating the configuration, test to make sure there are no syntax errors:<\/p>\n<pre><code class=\"language-bash\">sudo nginx -t<\/code><\/pre>\n<p>If the test is successful, reload Nginx to apply the changes:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl reload nginx<\/code><\/pre>\n<\/li>\n<li>\n<p>Auto-Renewal of SSL Certificates<br \/>\nLet's Encrypt certificates are valid for 90 days. However, Certbot should automatically set up a <em>timer<\/em> to renew your certificates before they expire.<br \/>\nTo verify the automatic renewal process, run the following command:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl list-timers | grep certbot<\/code><\/pre>\n<p>You should see a timer entry like <strong>certbot.timer<\/strong>. This indicates that a  systemd timer is set up to handle the renewal.<\/p>\n<\/li>\n<\/ol>\n<p>To test the renewal process, you can manually trigger it by running the following command:<\/p>\n<pre><code class=\"language-bash\">sudo certbot renew --dry-run<\/code><\/pre>\n<p>The <code>--dry-run<\/code> option simulates the renewal process without making any actual changes to your certificates. If this command runs without any errors, your automatic renewal setup is likely configured correctly.<\/p>\n<h1>Conclusion<\/h1>\n<p>And there you have it, a comprehensive step-by-step guide to deploying WordPress with the LEMP stack! By now, you should have a fully functioning WordPress site up and running on your very own LEMP server. I hope you found the instructions clear and straightforward.<\/p>\n<p>Deploying your WordPress site might have seemed like a daunting task at first, but look at you now! You've navigated through the nuances of setting up Linux, Nginx, MySQL, and PHP, and you've tackled the intricacies of server and site configurations with finesse.<\/p>\n<p>Remember, the journey doesn't end here. This is just the beginning of your adventure with your new WordPress site. Experiment with different themes, plugins, and settings to make your site uniquely yours. And most importantly, keep learning and exploring the vast possibilities that WordPress and the LEMP stack offer.<\/p>\n<p>If you ever hit a snag, don't hesitate to look back at this guide or leave a message. Additionally, you can seek out the abundant resources available online. The WordPress and developer communities are incredibly supportive and full of information.<\/p>\n<p>In conclusion, I hope this article has been helpful to you. There's a definite sense of achievement and satisfaction after completing such a task. I hope to persevere, continue to refine, and share more valuable content with those in need. In doing so, I aim to leave a small mark of my existence in this world.<\/p>\n<blockquote>\n<p>Reference:<br \/>\n<a href=\"https:\/\/developer.wordpress.org\/advanced-administration\/server\/web-server\/nginx\/\">https:\/\/developer.wordpress.org\/advanced-administration\/server\/web-server\/nginx\/<\/a><\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Estimated reading time: 15 min Introduction This note documents the process of deploying a WordPress website using the LEMP stack. Before we start, let&#8217;s briefly understand what LEMP and WordPress are. LEMP is an acronym that stands for Linux, Nginx (pronounced &quot;Engine-X&quot;), MySQL\/MariaDB, and PHP. It is a powerful and efficient software stack. Of course,&#8230;<\/p>\n","protected":false},"author":3,"featured_media":75,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[4],"tags":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/blog.devops955.com\/swain\/wp-content\/uploads\/sites\/2\/2024\/02\/wp.png","_links":{"self":[{"href":"https:\/\/blog.devops955.com\/swain\/wp-json\/wp\/v2\/posts\/61"}],"collection":[{"href":"https:\/\/blog.devops955.com\/swain\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.devops955.com\/swain\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.devops955.com\/swain\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.devops955.com\/swain\/wp-json\/wp\/v2\/comments?post=61"}],"version-history":[{"count":18,"href":"https:\/\/blog.devops955.com\/swain\/wp-json\/wp\/v2\/posts\/61\/revisions"}],"predecessor-version":[{"id":212,"href":"https:\/\/blog.devops955.com\/swain\/wp-json\/wp\/v2\/posts\/61\/revisions\/212"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.devops955.com\/swain\/wp-json\/wp\/v2\/media\/75"}],"wp:attachment":[{"href":"https:\/\/blog.devops955.com\/swain\/wp-json\/wp\/v2\/media?parent=61"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.devops955.com\/swain\/wp-json\/wp\/v2\/categories?post=61"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.devops955.com\/swain\/wp-json\/wp\/v2\/tags?post=61"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}