{"id":152727,"date":"2016-03-15T11:00:00","date_gmt":"2016-03-15T15:00:00","guid":{"rendered":"http:\/\/premium.wpmudev.org\/blog\/?p=152727"},"modified":"2017-06-27T02:06:43","modified_gmt":"2017-06-27T02:06:43","slug":"stress-testing-wordpress","status":"publish","type":"post","link":"https:\/\/wpmudev.com\/blog\/stress-testing-wordpress\/","title":{"rendered":"How to Stress Test Your WordPress Site for Traffic Surges"},"content":{"rendered":"<p>It&#8217;s important to know just how well your WordPress website can handle large amounts of traffic in the event you get a sudden traffic spike. With Tsung, you can stress test your site for free, see your server&#8217;s limits first-hand, and use the data to create a plan to scale your site.<\/p>\n<p><a href=\"http:\/\/tsung.erlang-projects.org\/\" rel=\"noopener\" target=\"_blank\">Tsung (formerly IDX-Tsunami)<\/a> is an open source distributed load testing tool that works on most servers and can stress test many platforms, including HTTP and MySQL. You can run it via SSH and it simulates a sudden amount of high traffic being sent to your site from a single machine, although, you can also create clusters.<\/p>\n<p>Tsung is developed in <a href=\"https:\/\/www.erlang.org\/\" rel=\"noopener\" target=\"_blank\">Erlang<\/a> and even though it is used to stress test your site, the actual processes it sends are lightweight so you can see how much your site can handle without breaking it or crashing Tsung.<\/p>\n<p>Unfortunately, the official documentation for Tsung isn&#8217;t completely up-to-date, so in this post I&#8217;ll show you how to install Tsung using <a href=\"https:\/\/www.gnu.org\/software\/wget\/\" target=\"_blank\">Wget<\/a>. I&#8217;ll also walk you through how to generate reports for each test you run so you can analyze the data that Tsung generates after a successful load test.<\/p>\n<h3>What is Tsung?<\/h3>\n<p>The development of a distributed\u00a0load stress test tool began in 2001 by Nicolas Niclausse, but it was meant\u00a0to be used internally by\u00a0IDEALX (now OpenTrust) and it wasn&#8217;t until several months later that it evolved into an open source project.<\/p>\n<p>Tsung simulates real users on a server and can stress test many platforms, including HTTP, WebDAV, SOAP, PostgreSQL, MySQL, LDAP and Jabber \/ XMPP servers.<\/p>\n<p>It can be used to test your site and send high load tests from 12,000 to 10 million simultaneous users.<\/p>\n<figure class=\"wp-caption aligncenter\" data-caption=\"true\"><img loading=\"lazy\" decoding=\"async\" class=\"attachment-490x490\" src=\"https:\/\/wpmudev.com\/blog\/wp-content\/uploads\/2016\/03\/stress-test-graph.png\" alt=\"A simple graph drawing.\" width=\"490\" height=\"312\" \/><figcaption class=\"wp-caption-text\">Graph reports can be generated from Tsung.<\/figcaption><\/figure>\n<p>In fact, these numbers weren&#8217;t just pulled out of nowhere\u00a0\u2013 it has been successfully used this way in the past.<\/p>\n<p>Tsung is now an industrial-strength tool that has been used by many high profile companies and institutions\u00a0including <a href=\"https:\/\/blogs.oracle.com\/kevinr\/resource\/Moodle-Sun-RA.pdf\" rel=\"noopener\" target=\"_blank\">Oracle, for its Moodle software platform<\/a>, and the French Finance Ministry (<em>Direction G\u00e9n\u00e9rale des Imp\u00f4ts<\/em> or DGI).<\/p>\n<p>You can run the tool through SSH on clients such as Terminal for Mac OS X or <a href=\"http:\/\/www.putty.org\/\" rel=\"noopener\" target=\"_blank\">PuTTY for Windows<\/a>. Fire up your favorite SSH client to get started right away.<\/p>\n<h3>Server Requirements<\/h3>\n<p>There are a few requirements needed in order to run Tsung so it&#8217;s important that they&#8217;re installed and taken care of first. Tsung can be installed on\u00a0Linux, Solaris, BSD, Win32 and Mac OS X servers and you need to have root access to your server in order to install and run Tsung.<\/p>\n<p>You can use <a href=\"https:\/\/www.sudo.ws\/\" rel=\"noopener\" target=\"_blank\">sudo<\/a> to run commands as the root user and you can check out the official documentation for these options to reference their installation:<\/p>\n<ul>\n<li><strong>Sudo<\/strong>\u00a0\u2013 <a href=\"https:\/\/www.sudo.ws\/\" rel=\"noopener\" target=\"_blank\">Sudo Main Page<\/a> and\u00a0<a href=\"https:\/\/www.linux.com\/blog\/how-use-sudo-and-su-commands-linux-introduction\" rel=\"noopener\" target=\"_blank\">Linux 101: Introduction to sudo<\/a><\/li>\n<\/ul>\n<p>You also need to have the latest version of PHP installed on your server. You can check out the\u00a0<a href=\"http:\/\/php.net\/manual\/en\/getting-started.php\" rel=\"noopener\" target=\"_blank\">Getting Started<\/a> and the\u00a0<a href=\"http:\/\/php.net\/manual\/en\/install.php\" rel=\"noopener\" target=\"_blank\">Installation and Configuration<\/a> guides for reference on how to install them.<\/p>\n<p>After logging into the root via SSH, you can check which version of PHP you&#8217;re running by entering\u00a0in <code>php -v<\/code>.<\/p>\n<h3>Installing Tsung and its Dependencies<\/h3>\n<p>Now you&#8217;re ready to start installing the programs that are necessary for Tsung to run. Many of them are already packaged into Tsung, but there are a few others you need to make sure you have installed as well.<\/p>\n<p>While you can install Tsung and its dependencies in many ways depending on your server, the installation process is covered here using Wget. If you don&#8217;t already have Wget installed on your server, you can check out the <a href=\"https:\/\/www.gnu.org\/software\/wget\/\" rel=\"noopener\" target=\"_blank\">Introduction to GNU Wget<\/a> guide.<\/p>\n<p>Start by installing Erlang, a programming language. You can grab a link to the latest version on <a href=\"http:\/\/www.erlang.org\/downloads\" rel=\"noopener\" target=\"_blank\">Erlang&#8217;s official download page<\/a>\u00a0and you can install it with Wget:<\/p>\n<div class=\"gist\" data-gist=\"3b1f5c96b7cc810c8afbdbc386d7db92\" data-gist-file=\"erlang.ssh\"><a class=\"loading\" href=\"https:\/\/gist.github.com\/3b1f5c96b7cc810c8afbdbc386d7db92.js?file=erlang.ssh\">Loading gist 3b1f5c96b7cc810c8afbdbc386d7db92<\/a><div class=\"gist-consent-notice\" style=\"display:none\"><p>Please <a href=\"javascript:Cookiebot.renew()\">update your cookie preferences<\/a> to enable preference cookies to view this gist.<\/p><\/div><\/div>\n<p>Keep in mind that you should make sure you&#8217;re installing the latest version of Erlang. Replace the URL in this example with the URL of the most up to date version from <a href=\"http:\/\/www.erlang.org\/downloads\" rel=\"noopener\" target=\"_blank\">Erlang&#8217;s download page<\/a>.<\/p>\n<p>Next, unpack the compressed file, but be sure you replace\u00a0<code>otp_src_18.2.1.tar.gz<\/code> with the name of the file you called with <code>wget<\/code>. It may not be the same if there have been updates since the time this article was written.<\/p>\n<div class=\"gist\" data-gist=\"8baffc14b9d66dd7a958deaa7e810f6f\" data-gist-file=\"erlang.ssh\"><a class=\"loading\" href=\"https:\/\/gist.github.com\/8baffc14b9d66dd7a958deaa7e810f6f.js?file=erlang.ssh\">Loading gist 8baffc14b9d66dd7a958deaa7e810f6f<\/a><div class=\"gist-consent-notice\" style=\"display:none\"><p>Please <a href=\"javascript:Cookiebot.renew()\">update your cookie preferences<\/a> to enable preference cookies to view this gist.<\/p><\/div><\/div>\n<p>Go to the directory you just created by entering this command, but don&#8217;t forget to replace\u00a0<code>otp_src_18.2.1<\/code> if needed:<\/p>\n<div class=\"gist\" data-gist=\"7393c212130f58829a16d219711907a2\" data-gist-file=\"erlang.ssh\"><a class=\"loading\" href=\"https:\/\/gist.github.com\/7393c212130f58829a16d219711907a2.js?file=erlang.ssh\">Loading gist 7393c212130f58829a16d219711907a2<\/a><div class=\"gist-consent-notice\" style=\"display:none\"><p>Please <a href=\"javascript:Cookiebot.renew()\">update your cookie preferences<\/a> to enable preference cookies to view this gist.<\/p><\/div><\/div>\n<p>Now it&#8217;s time to configure, build and install Erlang now that it&#8217;s uncompressed and on your server. You can use the following command and you don&#8217;t have to change anything:<\/p>\n<div class=\"gist\" data-gist=\"feca4da3a0f1c05e28f921d822852c14\" data-gist-file=\"install.ssh\"><a class=\"loading\" href=\"https:\/\/gist.github.com\/feca4da3a0f1c05e28f921d822852c14.js?file=install.ssh\">Loading gist feca4da3a0f1c05e28f921d822852c14<\/a><div class=\"gist-consent-notice\" style=\"display:none\"><p>Please <a href=\"javascript:Cookiebot.renew()\">update your cookie preferences<\/a> to enable preference cookies to view this gist.<\/p><\/div><\/div>\n<p>This last step may take a few minutes so feel free to grab some water or a cup of coffee in the meantime. Once that&#8217;s complete, you can install <a href=\"http:\/\/dev.perl.org\/perl5\/\" rel=\"noopener\" target=\"_blank\">Perl5<\/a> and <a href=\"http:\/\/www.gnuplot.info\/download.html\" rel=\"noopener\" target=\"_blank\">Gnuplot<\/a> in the same way if you don&#8217;t already have them installed. These are used to produce the text and image graphs and data after you run a stress test.<\/p>\n<p>You can also find the download file of <a href=\"https:\/\/sourceforge.net\/projects\/gnuplot\/files\/gnuplot\/\" rel=\"noopener\" target=\"_blank\">Gnuplot on Sourceforge<\/a>, but I found the installation was a bit trickier, though, only because I wasn&#8217;t paying close enough attention.<\/p>\n<p>When using <code>wget<\/code> to add the compressed file from SourceForge onto your server, I eventually noticed that I couldn&#8217;t uncompress the file using <code>tar xvzf gnuplot-5.0.3<\/code> because that wasn&#8217;t what the compressed file was called. Instead, I needed to unpack it with this command:<\/p>\n<div class=\"gist\" data-gist=\"aaf23d686afa67c6b60053747249eaf2\" data-gist-file=\"gnuplot.ssh\"><a class=\"loading\" href=\"https:\/\/gist.github.com\/aaf23d686afa67c6b60053747249eaf2.js?file=gnuplot.ssh\">Loading gist aaf23d686afa67c6b60053747249eaf2<\/a><div class=\"gist-consent-notice\" style=\"display:none\"><p>Please <a href=\"javascript:Cookiebot.renew()\">update your cookie preferences<\/a> to enable preference cookies to view this gist.<\/p><\/div><\/div>\n<p>I was only then able to go to the directory with the more obvious name:<\/p>\n<div class=\"gist\" data-gist=\"bea1cd276acb40c4bd009d8236ce11b3\" data-gist-file=\"gnuplot.ssh\"><a class=\"loading\" href=\"https:\/\/gist.github.com\/bea1cd276acb40c4bd009d8236ce11b3.js?file=gnuplot.ssh\">Loading gist bea1cd276acb40c4bd009d8236ce11b3<\/a><div class=\"gist-consent-notice\" style=\"display:none\"><p>Please <a href=\"javascript:Cookiebot.renew()\">update your cookie preferences<\/a> to enable preference cookies to view this gist.<\/p><\/div><\/div>\n<p>Afterward, I could finish by configuring and installing Gnuplot as you normally would for most other programs.<\/p>\n<p>It&#8217;s a good idea to do what I didn&#8217;t do at first, which is pay attention to details such as file names since it could be the reason why you get mysterious errors that, in truth, have easy fixes.<\/p>\n<p>The last step is to install Tsung and you can get the URL of the latest version from <a href=\"http:\/\/tsung.erlang-projects.org\/dist\/\" rel=\"noopener\" target=\"_blank\">Tsung&#8217;s download page<\/a>. Once you have the link, you can use <code>wget<\/code> to unpack and install it on your server just as described above for Erlang.<\/p>\n<h3>Running a Stress Test<\/h3>\n<p>After you have successfully installed Tsung and its dependencies, you&#8217;re ready to start your first stress test. This usually requires creating an XML file with the specifics on the type of test you want to run, but Tsung does come pre-loaded with sample files that are great to use.<\/p>\n<p>You can find these files by going into the secondary <em>tsung<\/em> directory, then to the <em>examples<\/em> folder by entering this command into your SSH client:<\/p>\n<div class=\"gist\" data-gist=\"072cefbdacc30288b5936207f672629b\" data-gist-file=\"tsung.ssh\"><a class=\"loading\" href=\"https:\/\/gist.github.com\/072cefbdacc30288b5936207f672629b.js?file=tsung.ssh\">Loading gist 072cefbdacc30288b5936207f672629b<\/a><div class=\"gist-consent-notice\" style=\"display:none\"><p>Please <a href=\"javascript:Cookiebot.renew()\">update your cookie preferences<\/a> to enable preference cookies to view this gist.<\/p><\/div><\/div>\n<p>Now you should be in the <em>\/tsung\/examples\/<\/em> directory from the root of your server, but you won&#8217;t be able to see any files listed until you enter <code>ls<\/code> to list all the files in this directory. Once they&#8217;re all listed, you can decide which script you want to run.<\/p>\n<p>Not all of the example files listed are going to be relevant to stress testing a WordPress site so be careful not to pick just any one of them.<\/p>\n<p>If you&#8217;re not exactly sure which one to try out, you can start with the <code>http_simple.xml<\/code> file. This is a great basic test to run for your WordPress site.<\/p>\n<figure class=\"wp-caption aligncenter\" data-caption=\"true\"><img loading=\"lazy\" decoding=\"async\" class=\"attachment-490x490\" src=\"https:\/\/wpmudev.com\/blog\/wp-content\/uploads\/2016\/03\/tsung-examples.png\" alt=\"Sample XML files are listed on the PuTTY client.\" width=\"490\" height=\"312\" \/><figcaption class=\"wp-caption-text\">The list of examples files have been generated.<\/figcaption><\/figure>\n<p>Once you decided on an XML file, you can run your stress test. Just be sure your SSH client is pointed to the directory where your file is located before entering the command to start the test.<\/p>\n<p>I decided to use the basic <code>http_simple.xml<\/code> so this is the command I would use to begin the test, though you could replace it with the file you want to use:<\/p>\n<div class=\"gist\" data-gist=\"1526f8498983c97a4fcc8f5cac85d844\" data-gist-file=\"tsung.ssh\"><a class=\"loading\" href=\"https:\/\/gist.github.com\/1526f8498983c97a4fcc8f5cac85d844.js?file=tsung.ssh\">Loading gist 1526f8498983c97a4fcc8f5cac85d844<\/a><div class=\"gist-consent-notice\" style=\"display:none\"><p>Please <a href=\"javascript:Cookiebot.renew()\">update your cookie preferences<\/a> to enable preference cookies to view this gist.<\/p><\/div><\/div>\n<p>A message should display saying &#8220;Starting Tsung,&#8221; then another line should follow with a message that looks similar to this one:<\/p>\n<blockquote><p>Log directory is: \/root\/.tsung\/log\/20160311-1644<\/p><\/blockquote>\n<p>This is where that data for the results of your stress test are stored. Make a note of it since you need it to generate and view a report. The log file itself is written to show the date and time of the stress test so it&#8217;s easier to keep track of all of them. It starts with the numeric year, the month and the day, followed by a hyphen, then the time in the 24-hour format.<\/p>\n<p>When your stress test is complete, you should know because you&#8217;re able to type in another command.<\/p>\n<h3>Generating a Report<\/h3>\n<p>Once your stress test has been completed, you can view a report of how it went, but first you need to generate one. You also can choose to generate one as the test is being completed so you can monitor the progress if you want.<\/p>\n<p>First, go back to the root by typing in <code>cd ~<\/code>, then go to the directory with your log. In keeping with the example above, here&#8217;s the kind of command you would enter to get there:<\/p>\n<div class=\"gist\" data-gist=\"ae2b00e1798cbe3a8b8d068f017b3418\" data-gist-file=\"tsung.ssh\"><a class=\"loading\" href=\"https:\/\/gist.github.com\/ae2b00e1798cbe3a8b8d068f017b3418.js?file=tsung.ssh\">Loading gist ae2b00e1798cbe3a8b8d068f017b3418<\/a><div class=\"gist-consent-notice\" style=\"display:none\"><p>Please <a href=\"javascript:Cookiebot.renew()\">update your cookie preferences<\/a> to enable preference cookies to view this gist.<\/p><\/div><\/div>\n<p>If you&#8217;re not sure what the direct path is to your root, you can replace <code>\/root<\/code> in the above example with a <code>~<\/code> punctuation to get the same result.<\/p>\n<p>To generate the report, type in the following command:<\/p>\n<div class=\"gist\" data-gist=\"53fa0a3fb8a7a94aa34cb1fadc29e8ac\" data-gist-file=\"tsung.ssh\"><a class=\"loading\" href=\"https:\/\/gist.github.com\/53fa0a3fb8a7a94aa34cb1fadc29e8ac.js?file=tsung.ssh\">Loading gist 53fa0a3fb8a7a94aa34cb1fadc29e8ac<\/a><div class=\"gist-consent-notice\" style=\"display:none\"><p>Please <a href=\"javascript:Cookiebot.renew()\">update your cookie preferences<\/a> to enable preference cookies to view this gist.<\/p><\/div><\/div>\n<p>Your reports should have been created and you can view them in the path you noted earlier. Once in that directory, you can enter the <code>ls<\/code> command to view the available report files.<\/p>\n<p>You can view them using an <a href=\"http:\/\/links.twibright.com\/download.php\" rel=\"noopener\" target=\"_blank\">SSH browser such as links<\/a> or other server-based browsers with graphics enabled. Links works on most servers and you can learn how to download and install links by checking out the <a href=\"http:\/\/links.twibright.com\/download.php\" rel=\"noopener\" target=\"_blank\">Twibright Lab&#8217;s Links Download<\/a> guide.<\/p>\n<p>Once it&#8217;s configured and installed and the graphics have been enabled, you can go to the directory where your logs are stored as shown above. Once you&#8217;re there, run the links command for the report page:<\/p>\n<div class=\"gist\" data-gist=\"7e1b85119ee31bcbf9e144dea727fd50\" data-gist-file=\"tsung.ssh\"><a class=\"loading\" href=\"https:\/\/gist.github.com\/7e1b85119ee31bcbf9e144dea727fd50.js?file=tsung.ssh\">Loading gist 7e1b85119ee31bcbf9e144dea727fd50<\/a><div class=\"gist-consent-notice\" style=\"display:none\"><p>Please <a href=\"javascript:Cookiebot.renew()\">update your cookie preferences<\/a> to enable preference cookies to view this gist.<\/p><\/div><\/div>\n<p>The page should display similar to a regular browser page and you should be able to view your report.<\/p>\n<figure class=\"wp-caption aligncenter\" data-caption=\"true\"><img loading=\"lazy\" decoding=\"async\" class=\"attachment-735x735 size-735x735\" src=\"https:\/\/wpmudev.com\/blog\/wp-content\/uploads\/2016\/03\/tsung-report.png\" alt=\"An HTML output of the stress test data.\" width=\"735\" height=\"300\" \/><figcaption class=\"wp-caption-text\">An example of a\u00a0report that&#8217;s generated by Tsung.<\/figcaption><\/figure>\n<p>The\u00a0report is divided into sections to show you information on the simulated traffic:<\/p>\n<ul>\n<li><code>request<\/code>\u00a0\u2013 Response time of each request<\/li>\n<li><code>page<\/code>\u00a0\u2013 A group of requests and the response time of each<\/li>\n<li><code>connect<\/code>\u00a0\u2013 Duration of the established connection<\/li>\n<li><code>reconnect<\/code>\u00a0\u2013 Number of times a reconnection occurred<\/li>\n<li><code>size_rcv<\/code> \u2013 Size of responses in bytes<\/li>\n<li><code>size_sent<\/code>\u00a0\u2013 Size of requests in bytes<\/li>\n<li><code>session<\/code>\u00a0\u2013 Duration of a simulated user&#8217;s session<\/li>\n<li><code>users<\/code>\u00a0\u2013 Number of simultaneous\u00a0simulated users that started a session, but didn&#8217;t finish<\/li>\n<li><code>connected<\/code>\u00a0\u2013 Number of users with an opened connection<\/li>\n<li><code>mean response time<\/code>\u00a0\u2013Average response time that&#8217;s calculated every 10 seconds and then resets<\/li>\n<\/ul>\n<p>It may be important to note that since the mean response time is reset every 10 seconds, there are likely to be different averages through different points during the test. This is why a lowest, highest and overall mean response time is calculated so you can see what your high and low points were along with how you did overall.<\/p>\n<p>One of the most important sections to look at when running a stress test on your site is the <strong>HTTP Return Code<\/strong> section. This is only something you should watch out for if you&#8217;re running an HTTP test.<\/p>\n<p>In such cases, if the code section shows anything higher than in the 200-300 range and reaches into the 400-500 range, your server needs some big changes or there are bugs.<\/p>\n<p>You may have had too many simultaneous requests in the test, which means your server isn&#8217;t quite scaling or there are bugs on your site, server or in the XML file you used for the test. Overall, this is a great indicator of a successful\u00a0\u2013 or not so successful\u00a0\u2013 test of your site and server.<\/p>\n<p>You could also create your own XML files to fully customize the test if you would like and the details on how to do this are in the <a href=\"http:\/\/tsung.erlang-projects.org\/user_manual\/configuration.html\" rel=\"noopener\" target=\"_blank\">Tsung official documentation<\/a>.<\/p>\n<h3>Finishing the Stress Test<\/h3>\n<p>Stress testing your site and server is a great way to learn whether or not improvements can be made and if your site is set up well for scalability. With Tsung, you\u00a0can not only run these kinds of tests for free, but\u00a0detailed reports are also generated so you can see how your server handles a sudden traffic spike.<\/p>\n<p>You can also run the <code>tsung -h<\/code> command to get a useful lists of options available to run a tsung stress test. If you need more help and need to ask a question, there are many companies pitching in to offer support and you can find a complete list on the <a href=\"http:\/\/tsung.erlang-projects.org\/support.en.html\" rel=\"noopener\" target=\"_blank\">support page<\/a> on the Tsung website.<\/p>\n<p>You can also check out the <a href=\"https:\/\/github.com\/processone\/tsung\/issues\" rel=\"noopener\" target=\"_blank\">bug tracker on GitHub<\/a> to submit an issue if you find one, although, it may be important to note that you may not get proper support if you have an issue with using Tsung, rather than if you were reporting a bug.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Can your website handle unexpected traffic spikes? With Tsung, you can stress test your site for free, see your server&#8217;s limits first-hand, and use the data to create a plan to scale your site. Here&#8217;s how to set it up.<\/p>\n","protected":false},"author":54213,"featured_media":153086,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"blog_reading_time":"","wds_primary_category":0,"wds_primary_tutorials_categories":0,"footnotes":""},"categories":[557,1117],"tags":[9997,10789,10427],"tutorials_categories":[],"class_list":["post-152727","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","category-multisite","tag-server","tag-testing-environment","tag-traffic"],"_links":{"self":[{"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/posts\/152727","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/users\/54213"}],"replies":[{"embeddable":true,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/comments?post=152727"}],"version-history":[{"count":24,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/posts\/152727\/revisions"}],"predecessor-version":[{"id":209618,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/posts\/152727\/revisions\/209618"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/media\/153086"}],"wp:attachment":[{"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/media?parent=152727"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/categories?post=152727"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/tags?post=152727"},{"taxonomy":"tutorials_categories","embeddable":true,"href":"https:\/\/wpmudev.com\/blog\/wp-json\/wp\/v2\/tutorials_categories?post=152727"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}