When doing low-priority tasks like backups are fixing permissions on a cronjob, it is a good idea to modify the niceness of the script. By using ionice and renice, you can ensure it won't get in the way of your important programs.
Web development all-around, including PHP, CSS, HTML, Hosting, MySQL, Symfony, Drupal and Wordpress.
Pages
▼
Wednesday, December 26, 2012
Friday, December 21, 2012
Choosing the best wireless router for a small office
At my office, we needed a new router. With more than 50 devices that are quite heavily using the network, we we crushing our basic personal router.
After some unsuccessful searches, I asked the question on Reddit and I worked from there.
Our setup:
I knew I wanted some sort of QoS to prioritize usage. Ex: Skype > SSH > Browsers > FTP and at our location, good quality connections at a decent price is pretty hard to find so I was looking forward to a Dual-WAN setup.
After some unsuccessful searches, I asked the question on Reddit and I worked from there.
Our setup:
- 20~25 wired computers
- 20~25 wireless computers
- ~25 smartphones
- ~500 GB download/month
- ~300 GB upload/month
- Google Apps (Docs, Spreadsheet, Gmail, etc.) – A lot of AJAX requests
- SSH – Needs very low latency
- Skype – High bandwidth usage
- Dropbox – Moderate bandwidth usage
- Sending and receiving >5GB files
- Syncing thousands of files over FTP
- Dlink DIR-655 acting as the gateway: http://goo.gl/TXXs0[1]
- WRT54 acting as a router and a wifi AP, configured with DD-WRT: http://goo.gl/Wu89u[2]
I knew I wanted some sort of QoS to prioritize usage. Ex: Skype > SSH > Browsers > FTP and at our location, good quality connections at a decent price is pretty hard to find so I was looking forward to a Dual-WAN setup.
Upload speed
When you are trying to improve your Internet connection for a lot of people, it will most likely be your upload speed that will be the bottleneck. For 30 heavy users, try to have at least 5mbps in upload
Network link speed negotiation
Router often use a non-standard algorithm to detect the speed of the link between the router and the modem, 10, 100 or 1000 mbps and sometimes, it can’t get it right. Fail to detect the current speed and you may end up talking at 10mbps to a modem trying to work at 60mbps. More often than not, you want this to be set at 100mbps.
AP
The router I chose has wireless antennas, but I you are 30 people on the same antennas, you will experience come slowdown. Consider installing some access-points over the place. You will have to wire them together, but it is much simpler than wiring everyone.
Router
I had heard good comments about Draytek and so Reddit confirmed it. They are pretty solid, easy to configure and a much cheaper alternative than their Cisco counterparts. I finally went for a Draytek 2920n. This is about 250$, supports balancing and failover with a second Internet connection and it is managed in about the same fashion as a common router. The big difference is that it is much more powerful and can handle a traffic of a hundred devices without struggling. It was a godsend, we didn’t even need to upgrade the Internet connection, check it out.Other options
Meraki is especially cool with all the remote management, very easy management and automatic updates, but they were a bit too expensive for our needs.
Monday, December 17, 2012
Varnish 3 configuration
Shared caches are pretty strict when it comes to caching or not a request. This is good, otherwise it would cache requests that are not meant to be cached.
However, there is some things that can be done to improve cacheability:
However, there is some things that can be done to improve cacheability:
- Ignore Google Analytics cookies
- Remove empty Cookie line
- Normalize Accept-Encoding header
- Allow replying with a stale response if the backend is slow
Bonus:
- Remove some headers to reduce header size and hide some details about the server (security).
- Add a debug header to help understand why a request is cached or not.
How to properly create and destroy a PHP session
When working with shared caches like Varnish or Nginx, cookies will kill everything you are trying to do.
The idea is that since a cookie can be used by the backend to modify the reply, like being logged in as a user, the shared does not take the chance and refuse to cache it. This behaviour can be modified, especially in the case of Google Analytics cookies, but for the PHP session cookie, you will typically want it.
However, it is important, for a useful usage of your shared cache, to only start a session when you really need it and destroy it when it is not needed anymore. PHP’s session_start specifically mentions that is does not unset the associated cookie.
So the idea is to start a session when you need it; for example, in a login page. This will send a header to the client, setting a cookie and the cookie will get sent back on every request. Therefore, in some global file, you can detect this cookie and reload the session. At last, on the logout, clear everything.
The idea is that since a cookie can be used by the backend to modify the reply, like being logged in as a user, the shared does not take the chance and refuse to cache it. This behaviour can be modified, especially in the case of Google Analytics cookies, but for the PHP session cookie, you will typically want it.
However, it is important, for a useful usage of your shared cache, to only start a session when you really need it and destroy it when it is not needed anymore. PHP’s session_start specifically mentions that is does not unset the associated cookie.
So the idea is to start a session when you need it; for example, in a login page. This will send a header to the client, setting a cookie and the cookie will get sent back on every request. Therefore, in some global file, you can detect this cookie and reload the session. At last, on the logout, clear everything.
Wednesday, December 5, 2012
Generate Lorem Ipsum using loripsum.net API
loripsum.net describes itself as “The ‘lorem ipsum’ generator that doesn't suck”. It is the same text you are used to see over and over except that it is decorated with various HTML tags like <ul>, <b>, etc.
Seeing this, I thought it would be nice to use it to generate data fixtures that are meant to be used as blog posts, pages, comments, etc. I started a prototype for Wordpress, I should come up with a post about it soon enough, but in the mean time, I thought it would be valuable to share this little interface.
It is pretty straight forward and the options are documented in the code itself. Have fun!
Seeing this, I thought it would be nice to use it to generate data fixtures that are meant to be used as blog posts, pages, comments, etc. I started a prototype for Wordpress, I should come up with a post about it soon enough, but in the mean time, I thought it would be valuable to share this little interface.
It is pretty straight forward and the options are documented in the code itself. Have fun!