Useful Snippets

Welcome!


This blog is used to collect useful snippets related to Linux, PHP, MySQL and more. Feel free to post comments with improvements or questions!

Are your smart devices spying on you? Make better purchasing choices and find products that respect your privacy at Unwanted.cloud

RSS Latest posts from my personal blog


Subscribe to RSS feed


Installing WordPress on a tiny wireless router

Stanislav KhromovStanislav Khromov

I recently got a Gl.Inet 6416 router off AliExpress for about $25. It’s an interesting little box that includes many features that routers ten times more expensive lack. (Thanks OpenWRT and open source!) The box is powered by the Atheros AR9331, an aging MIPS architecture processor clocked at a measly 400mhz with 64MB of RAM and 16MB of storage. In computer years, MIPS is stone-age technology, first launched in 1981(!), and the MIPS 24K standard this particular processor implements was first launched in 2004.

view3

But the router is still quite capable even by 2016 standards! There is an SSH server and a package manager, opkg, which has packages for PHP 5.6. I immediately thought of something crazy to do – namely to install WordPress on this poor little machine.

So let’s see how that works.

Scaling things down

64MB of memory can’t accomodate either Apache or MySQL, so we have to find a way to run without them. Luckily, PHP has a built-in web server since version 5.4 that we can use, and WordPress has a SQLite plugin. This is a truly cool plugin that hooks into the db.php drop-ins and dynamically rewrites all WordPress database calls from MySQL to SQLite-compatible syntax.

sqlite-e-WordPress

Increasing the storage

16 MB of internal storage won’t get us far. Luckily, you can insert a USB drive and it happily mounts it under /mnt/sda1, so let’s do that:

IMG_20160717_031209-01 - Copy

Installing dependencies

Let’s SSH into the router and install SQLite, PHP and some useful tools like wget…

opkg install zoneinfo-core sqlite3-cli sqlite3 wget htop ca-certificates php5-cli php5 php5-mod-session php5-mod-pdo-mysql php5-mod-gd php5-mod-hash php5-mod-mbstring php5-mod-json php5-mod-opcache php5-mod-sqlite3 php5-mod-pdo-sqlite

Installing WordPress

Unfortunately, there is no support for Phar archives and hence no simple way to run WP-CLI or Composer, so let’s install WP manually:

cd /mnt/sda1
wget https://wordpress.org/wordpress-4.5.3.zip
unzip wordpress-4.5.3.zip
wget https://downloads.wordpress.org/plugin/sqlite-integration.1.8.1.zip
unzip sqlite-integration.1.8.1.zip
mv sqlite-integration wordpress/wp-content/plugins

Now let’s move the db.php drop-in into place:

cp wordpress/wp-content/plugins/sqlite-integration/db.php wordpress/wp-content/db.php

Let’s also create a default wp-config.php file:

cp wordpress/wp-config-sample.php wordpress/wp-config.php

Tweaking the PHP config

Some PHP defaults aren’t a good fit for this ancient architecture. Let’s decrease opcache.memory_consumption from 64MB to 8MB and increase the max_execution_time from 30 to 300 in /etc/php.ini

Booting it up

Now let’s finally start this baby up on the built-in PHP web server:

cd wordpress
php-cli -S 0.0.0.0:8080

Loading up the browser the router IP on port 8080 gives us a familiar sight:

http://192.168.8.1:8080

http://192.168.8.1:8080

Thanks to the SQLite adapter, we don’t need to provide database credential, an on-disk database has already been created for us in wordpress/wp-content/database/.ht.sqlite.

After about 40 seconds, the install finally finishes!

2016-07-17 02_52_28-Program Manager

So what’s the speed like?

It comes as no surprise that this is suh-low! A pageload takes 5-15 seconds. Sometimes even longer if you are saving a draft or publishing a post:

2016-07-17 02_56_33-Program Manager

Other than that, it does actually run! Although uploading large images tends to make the built-in server crash with an out-of-memory error. Not surprising, considering we only have about 40 MB of RAM to play with (The operating system takes up approximately 25MB RAM).

Conclusion

Even though this is a silly project it shows that it is not only possible to run WordPress on OpenWRT, but that it is fairly pain-free to set up. There are more powerful MIPS processors out there (like the Qulcomm QCA9531 with 650mhz/128MB RAM) and those might actually make this usable for a real site. Hope you learned about some techniques to use WordPress in low-memory environments!

Full-stack impostor syndrome sufferer & Software Engineer at Schibsted Media Group

Comments 14
  • Putra Rahmat Kurniawan
    Posted on

    Putra Rahmat Kurniawan Putra Rahmat Kurniawan

    Reply Author

    Cool,.. while 2 years back, I though that was not possible, since php 5.4, btw how much size mount SDA card swap file, you used during this moment? I’m looking for running on the tplink Archer platform.


    • Stanislav Khromov
      Posted on

      Stanislav Khromov Stanislav Khromov

      Reply Author

      Hey Putra,

      I didn’t mount a swap file, this is why I got out-of-memory errors. But setting something like 128MB makes it possible (but very slow) to upload images. :-)

      Although, if you are interested in such a build, GL.inet has a slightly beefier model with 650mhz CPU / 128 MB RAM that would probably work much better:
      http://www.gl-inet.com/ar300m/


  • KD
    Posted on

    KD KD

    Reply Author

    Cool project for a weekend, Nice work mate,


  • Stu
    Posted on

    Stu Stu

    Reply Author

    How would you rewrite this (guide) for a more accommodating unit with enough memory to install the full stack (without sqlite but with mysql).

    Great tutorial and it worked for me, just would like to take it to the next level if you could help us out.

    Thanks!
    Stu


  • Vox
    Posted on

    Vox Vox

    Reply Author

    Did you ever follow up on;

    ” Although, if you are interested in such a build, GL.inet has a slightly beefier model with 650mhz CPU / 128 MB RAM that would probably work much better:
    http://www.gl-inet.com/ar300m/

    I would be very interested to hear if you did.


    • Stanislav Khromov
      Posted on

      Stanislav Khromov Stanislav Khromov

      Reply Author

      I actually got an GL-AR300M to do this but it got stuck in a bootloop so I wasn’t able to finish it. :-(

      I think the improvement would be 20% tops, accounting for the improved processor.

      What would be really interesting is if someone compiled PHP7 packages for this architecture, that would add another 30% performance increase and we’d perhaps be at a usable response time. (a couple of seconds).