stroopwafels and raspberry pie (joomla on raspberry pi with nginx)
Post on 03-Jan-2016
521 Views
Preview:
DESCRIPTION
TRANSCRIPT
PowerPoint Presentation
Stroopwafels & Raspberry Pie
Peter Martin, twitter: @pe7er
JandBeyond.org 2013, Sat June 1st 2013
Joomla & Raspberry Pi
Peter Martin, twitter: @pe7er
JandBeyond.org 2013, Sat June 1st 2013
Overview Presentation
1. IntroductionLAMP Stack:
2. Raspbian
3. Nginx
4. MySQL
5. PHP
6. phpMyAdmin
7. Joomla
8. Performance
9. Security
10. Geeky stuff
>>> Sheets at: www.db8.nl Profile Information
Browser plugins, e.g. Yslow
8. Performance
Test: Refresh (3x) new setting > Refresh (3x) &
compare
8. Performance 10 ways to optimize
Nginx + PHP-FPM
8. Performance Nginx + PHP-FPM
PHP-FPMSocket vs Port?fastcgi_passunix:/var/run/php5-fpm.sock;
fastcgi_pass127.0.0.1:9000;
socket connections are around 10-15% faster than TCP/IP
connections because it saves the passing the data over the
different layers of TCP/IP stack
8. Performance 10 ways to optimize
Nginx + PHP-FPM
Joomla gzip
8. Performance Joomla gzip
Before1. Application 2.517 seconds (+0.037); 4.67 MB (+0.035) -
afterRender
After
Global Configuration > Server > Gzip Page Compression1.
Application 3.009 seconds (+0.038); 4.67 MB (+0.035) -
afterRender
2. Application 2.503 seconds (+0.037); 4.67 MB (+0.035) - afterRender
8. Performance 10 ways to optimize
Nginx + PHP-FPM
Joomla gzip
Joomla cache
8. Performance Joomla cache
BeforeApplication 2.707 seconds (+0.037); 4.67 MB (+0.035) - afterRender
After
Global Configuration > System > Cache* > ON Progressive
caching
1. Application 2.718 seconds (+0.051); 4.69 MB (-0.027) - afterRender
2. Application 1.543 seconds (+0.114); 4.02 MB (+0.051) - afterRender
3. Application 1.426 seconds (+0.265); 3.95 MB (+0.334) - afterRender
8. Performance 10 ways to optimize
Nginx + PHP-FPM
Joomla gzip
Joomla cache
Nginx gzip
8. Performance Nginx gzip
pi@rpi ~ $ sudo nano /etc/nginx/nginx.conf
# Gzip Settings
gzip on;
gzip_static on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 512;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/css text/javascript text/xml text/plain
text/x-component application/javascript application/x-javascript
application/json application/xml application/rss+xml;
8. Performance Nginx gzip
BeforeApplication 1.447 seconds (+0.274); 3.95 MB (+0.334) afterRender
After gzip in Nginx
Application 1.421 seconds (+0.267); 3.95 MB (+0.334) - afterRender
Application 1.436 seconds (+0.274); 3.95 MB (+0.334) - afterRender
8. Performance 10 ways to optimize
Nginx + PHP-FPM
Joomla gzip
Joomla cache
Nginx gzip
Nginx cache
8. Performance Nginx cache
pi@rpi ~ $ sudo nano
/etc/nginx/sites-available/petermartin.nl
server {
# caching of files
location ~* \.(ico|pdf|flv)$ {
expires 1y;
}
location ~* \.(js|css|png|jpg|jpeg|gif|swf|xml|txt)$ {
expires 14d;
}
}
8. Performance Nginx cache
BeforeApplication 1.459 seconds (+0.301); 3.95 MB (+0.334) - afterRender
After
Application 1.464 seconds (+0.308); 3.95 MB (+0.334) - afterRender
Application 1.459 seconds (+0.299); 3.95 MB (+0.334) - afterRender
8. Performance 10 ways to optimize
Nginx + PHP-FPM
Joomla gzip
Joomla cache
Nginx gzip
Nginx cache
APC
8. Performance Alternative PHP Cache
pi@rpi ~ $ sudo apt-get install php-apc php-pear php5-dev
build-essential libpcre3-dev
{Settings in PHP.ini}
pi@rpi ~ $ sudo pear config-set php_ini /etc/php5/fpm/php_ini
pi@rpi ~ $ sudo pecl config-set php_ini /etc/php5/fpm/php_ini
{Download/compile/install APC}
pi@rpi ~ $ sudo pecl install apc
8. Performance Alternative PHP Cache
BeforeApplication 1.459 seconds (+0.299); 3.95 MB (+0.334) - afterRender
After install APC restart nginx AND php-fpm!!!$ sudo /etc/init.d/nginx restart
$ sudo /etc/init.d/php5-fpm reload
1. Application 1.813 seconds (+0.311); 4.52 MB (+0.403) - afterRender
2. Application 0.696 seconds (+0.198); 2.00 MB (+0.148) - afterRender
3. Application 0.727 seconds (+0.221); 2.00 MB (+0.148) - afterRender
8. Performance Alternative PHP Cache
APC GUI
$ sudo cp /usr/share/doc/php-apc/apc.php
/var/www/petermartin.nl/apc.php
8. Performance 10 ways to optimize
Nginx + PHP-FPM
Joomla gzip
Joomla cache
Nginx gzip
Nginx cache
APC
JCH Optimize / jbetolo
8. Performance Joomla Plugins
Less data traffic:Combine CSS / JavaScript
Minify CSS / JavaScript
Gzip CSS / JavaScript
Joomla Plugins, e.g.JCH Optimize
Jbetolo
Yireo Script Merge
Plugins vs manual
8. Performance Joomla Plugins
JCH Optimize, beforeApplication 0.772 seconds (+0.071); 2.03 MB (-0.080) afterRender
After
Application 0.864 seconds (+0.341); 2.06 MB (+0.177) - afterRender
Application 1.723 seconds (+0.170); 2.43 MB (-0.019) - afterRender
Application 1.016 seconds (+0.118); 2.08 MB (-0.029) - afterRender
Application 0.691 seconds (+0.217); 2.05 MB (+0.172) - afterRender
8. Performance Joomla Plugins
jbetolo, beforeApplication 0.620 seconds (+0.165); 2.00 MB (+0.148) - afterRender
After
Application 1.810 seconds (+1.234); 2.31 MB (+0.233) - afterRender
Application 0.751 seconds (+0.222); 2.27 MB (+0.193) - afterRender
Application 0.769 seconds (+0.223); 2.27 MB (+0.193) - afterRender
8. Performance 10 ways to optimize
Nginx + PHP-FPM
Joomla gzip
Joomla cache
Nginx gzip
Nginx cache
APC
JCH Optimize / jbetolo
Memcached
8. Performance Memchached
pi@rpi ~ $ sudo apt-get install memcached php5-memcache
{Download/compile/install APC}
pi@rpi ~ $ sudo pecl install memcache
{Reboot}
pi@rpi ~ $ sudo service nginx restart
pi@rpi ~ $ sudo service mysql restart
pi@rpi ~ $ sudo service php5-fpm restart
pi@rpi ~ $ sudo service memcached restart
8. Performance Memchached
BeforeApplication 0.677 seconds (+0.198); 2.00 MB (+0.148) - afterRender
After
Application 1.673 seconds (+0.320); 4.52 MB (+0.403) - afterRender
Application 0.721 seconds (+0.199); 2.00 MB (+0.148) - afterRender
Application 0.705 seconds (+0.211); 2.00 MB (+0.148) - afterRender
Application 0.678 seconds (+0.199); 2.00 MB (+0.148) - afterRender
8. Performance 10 ways to optimize
Nginx + PHP-FPM
Joomla gzip
Joomla cache
Nginx gzip
Nginx cache
APC
JCH Optimize / jbetolo
Memcached
Overclocking
8. Performance Overclocking
$ sudo raspi-config
8. Performance Overclocking
BeforeApplication 0.678 seconds (+0.210); 2.00 MB (+0.151) - afterRender
AfterApplication 0.649 seconds (+0.171); 2.05 MB (+0.153) - afterRender
Application 0.579 seconds (+0.169); 2.00 MB (+0.151) - afterRender
Application 0.596 seconds (+0.167); 2.00 MB (+0.151) - afterRender
Application 0.620 seconds (+0.167); 2.00 MB (+0.151) - afterRender
Application 0.583 seconds (+0.167); 2.00 MB (+0.151) - afterRender
8. Performance 10 ways to optimize
Nginx + PHP-FPM
Joomla gzip
Joomla cache
Nginx gzip
Nginx cache
APC
JCH Optimize / jbetolo
Memcache
Overclocking
Cryogenics
8. Performance Cryogenics
Superconducting computersSuperconductivity in certain materials
when cooled below a characteristic critical temperature
Cool down RPi?Fridge: RPi = small, but not enough room for beer :-(
Not cool enough... < 123 K ( = 150 C, 238 F)
Liquid nitrogen or liquid helium?Couldn't decide which...
performance gain when cooling down: N/A
8. Performance My RPi
Every server/site different configuration for
performance
My RPi:PHP-FPM: fastcgi_pass to Unix Socket (not IP+port)
Joomla: (progressive) cache (2.7 -> 1.4 sec)
Alternative PHP Cache (1.4 -> 0.7 sec)
9. Security
9. Security 10 Aspects
Change default username pi & password
Backup !!!
Study logfiles (e.g. with Logwatch)
9. Security ssh logfiles
/var/log/auth.logApr 8 22:49:01 rpi sshd[10812]: reverse mapping
checking getaddrinfo for
95.148.175.59.broad.wh.hb.dynamic.163data.com.cn [59.175.148.95]
failed - POSSIBLE BREAK-IN ATTEMPT!
Apr 8 22:49:01 rpi sshd[10812]: pam_unix(sshd:auth): authentication
failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=59.175.148.95
user=root
Apr 8 22:49:04 rpi sshd[10812]: Failed password for root from
59.175.148.95 port 43066 ssh2
Apr 8 22:49:04 rpi sshd[10812]: Received disconnect from
59.175.148.95: 11: Bye Bye [preauth]
Apr 8 22:49:07 rpi sshd[10816]: reverse mapping checking
getaddrinfo for 95.148.175.59.broad.wh.hb.dynamic.163data.com.cn
[59.175.148.95] failed - POSSIBLE BREAK-IN ATTEMPT!
Apr 8 22:49:07 rpi sshd[10816]: pam_unix(sshd:auth): authentication
failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=59.175.148.95
user=root
Apr 8 22:49:09 rpi sshd[10816]: Failed password for root from
59.175.148.95 port 44636 ssh2
Apr 8 22:49:10 rpi sshd[10816]: Received disconnect from
59.175.148.95: 11: Bye Bye [preauth]
Apr 8 22:49:13 rpi sshd[10820]: reverse mapping checking
getaddrinfo for 95.148.175.59.broad.wh.hb.dynamic.163data.com.cn
[59.175.148.95] failed - POSSIBLE BREAK-IN ATTEMPT!
Apr 8 22:49:13 rpi sshd[10820]: pam_unix(sshd:auth): authentication
failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=59.175.148.95
user=root
Apr 8 22:49:15 rpi sshd[10820]: Failed password for root from
59.175.148.95 port 46051 ssh2
Apr 8 22:49:16 rpi sshd[10820]: Received disconnect from
59.175.148.95: 11: Bye Bye [preauth]
Apr 8 22:49:19 rpi sshd[10824]: reverse mapping checking
getaddrinfo for 95.148.175.59.broad.wh.hb.dynamic.163data.com.cn
[59.175.148.95] failed - POSSIBLE BREAK-IN ATTEMPT!
Apr 8 22:49:19 rpi sshd[10824]: pam_unix(sshd:auth): authentication
failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=59.175.148.95
user=root
9. Security ssh logfiles
peter@rpi ~$ whois 59.175.148.95% [whois.apnic.net node-5]
% Whois data copyright terms
http://www.apnic.net/db/dbcopyright.htmlinetnum:59.174.0.0
59.175.255.255
netname:CHINANET-HB
descr:CHINANET Hubei province network
descr:Data Communication Division
descr:China Telecom
country:CNrole:CHINANET HB ADMIN
address:8th floor of JinGuang Building
address:#232 of Macao Road
address:HanKou Wuhan Hubei Province
address:P.R.China
country:CN
phone:+86 27 82862199
fax-no:+86 27 82861499
e-mail:ip_admin_hb@public.wh.hb.cn
remarks:send spam reports to spam_hb@public.wh.hb.cn
remarks:and abuse reports to abuse_hb@public.wh.hb.cn
remarks:Please include detailed information and
remarks:times in GMT+8
9. Security 10 Aspects
Change default username pi & password
Backup !!!
Study logfiles (e.g. with Logwatch)
Block ssh root login !
Block portscans -> Firewall
9. Security Firewall
{check Firewall}
peter@rpi ~$ sudo iptables -LChain INPUT (policy ACCEPT)
targetprot opt sourcedestinationChain FORWARD (policy ACCEPT)
targetprot opt sourcedestinationChain OUTPUT (policy ACCEPT)
targetprot opt sourcedestination
{create rules for Firewall}peter@rpi ~$ sudo nano
/etc/iptables.firewall.rules
9. Security Configure Firewall 1/2
*filter# Allow all loopback (lo0) traffic and drop all traffic to
127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT
# Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow all outbound traffic - you can modify this to only allow
certain traffic
-A OUTPUT -j ACCEPT
# Allow HTTP and HTTPS connections from anywhere (the normal ports
for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
9. Security Configure Firewall 2/2
# Allow SSH connections
# The -dport number should be the same port number you set in
sshd_config
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# Allow ping
-A INPUT -p icmp -j ACCEPT
# Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables
denied: " --log-level 7
# Drop all other inbound - default deny unless explicitly allowed
policy
-A INPUT -j DROP
-A FORWARD -j DROP
COMMIT
9. Security Activate Firewall 1/2
{activate Firewall}
peter@rpi ~$ sudo iptables-restore <
/etc/iptables.firewall.rules
{check Firewall}
peter@rpi ~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
targetprot opt sourcedestination
ACCEPTall --anywhereanywhere
REJECTall --anywhereloopback/8reject-with
icmp-port-unreachable
ACCEPTall --anywhereanywherestate RELATED, ESTABLISHED
ACCEPTtcp --anywhereanywheretcp dpt:http
LOGall --anywhereanywherelimit: avg 5/min burst 5 LOG level debug
prefix "iptables denied: "
DROPall --anywhereanywhere
[..]
9. Security Activate Firewall 2/2
{script: activate Firewall at reboot}
peter@rpi ~$ sudo nano /etc/network/if-pre-up.d/firewall
{put in /etc/network/if-pre-up.d/firewall}
#!/bin/sh/sbin/iptables-restore <
/etc/iptables.firewall.rules
{set script permissions}
peter@rpi ~$ sudo chmod +x /etc/network/if-pre-up.d/firewall
9. Security Automate Firewall
9. Security Fail2Ban
Scan logfiles & take action automatically
Jail configurationIf in entry in logfile matches filter
n times
Put IP on blocklist for x minutes/etc/fail2ban/jail.conf default
/etc/fail2ban/jail.local override
Filters/etc/fail2ban/filter.d/
Regex ROOT LOGIN REFUSED, POSSIBLE BREAK-IN ATTEMPT!, Failed password etc...
9. Security Fail2Ban
{install Fail2Ban}
peter@rpi ~$ sudo apt-get install fail2ban
Reading package lists... Done
0 upgraded, 6 newly installed, 0 to remove and 0 not
upgraded.
Need to get 340 kB of archives.
{check failed login attempts}
peter@rpi ~$ cat fail2ban.log
2013-04-09 16:45:59,000 fail2ban.actions: WARNING [ssh] Ban
9.8.7.6
{check Firewall}
peter@rpi ~$ sudo iptables -LChain fail2ban-ssh (1
references)
targetprot opt sourcedestination
DROPall -- test123.example.comanywhere
RETURNall -- anywhereanywhere
9. Security 10 Aspects
Change default username pi & password
Backup !!!
Study logfiles (e.g. with Logwatch)
Block ssh root login !
Block portscans -> Firewall
Block scriptkiddies
9. Security Webserver access logs
/var/log/nginx/petermartin.nl.access_log198.7.57.74 - -
[30/Mar/2013:16:47:49 +0100] "GET
/w00tw00t.at.blackhats.romanian.anti-sec:) HTTP/1.1" 404 1565 "-"
"ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:52 +0100] "GET
/phpmyadmin/scripts/setup.php HTTP/1.1" 403 135 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:52 +0100] "GET
/pma/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:52 +0100] "GET
/myadmin/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:53 +0100] "GET
/MyAdmin/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:53 +0100] "GET
/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:54 +0100] "GET
/typo3/phpmyadmin/scripts/setup.php HTTP/1.1" 404 47 "-"
"ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:55 +0100] "GET
/phpadmin/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:55 +0100] "GET
/phpMyAdmin/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:55 +0100] "GET
/phpmyadmin/scripts/setup.php HTTP/1.1" 403 135 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:55 +0100] "GET
/phpmyadmin1/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:55 +0100] "GET
/phpmyadmin2/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:56 +0100] "GET
/pma/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:56 +0100] "GET
/web/phpMyAdmin/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:56 +0100] "GET
/xampp/phpmyadmin/scripts/setup.php HTTP/1.1" 404 47 "-"
"ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:56 +0100] "GET
/web/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:56 +0100] "GET
/php-my-admin/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:47:56 +0100] "GET
/websql/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:48:23 +0100] "GET
/sqlmanager/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:48:23 +0100] "GET
/mysqlmanager/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:48:23 +0100] "GET
/p/m/a/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:48:23 +0100] "GET
/PMA2005/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:48:24 +0100] "GET
/pma2005/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:48:24 +0100] "GET
/phpmanager/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:48:24 +0100] "GET
/php-myadmin/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:48:24 +0100] "GET
/sqlweb/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:48:24 +0100] "GET
/webdb/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:48:24 +0100] "GET
/mysqladmin/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
198.7.57.74 - - [30/Mar/2013:16:48:24 +0100] "GET
/websql/scripts/setup.php HTTP/1.1" 404 47 "-" "ZmEu"
9. Security Fail2Ban configuration
{no w00tw00t for you ;-)}
peter@rpi ~$ sudo nano
/etc/fail2ban/filter.d/nginx-w00tw00t.conf
# Fail2Ban configuration file
# Author: Peter Martin
# $Revision: 001 $
[Definition]
# Option: failregex
failregex = ^ -.*GET.*(w00tw00t|\setup.php|\wp-login.php)
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is
ignored.
# Values: TEXT
#
ignoreregex =
9. Security Fail2Ban configuration
{activate nginx-w00tw00t filter}
peter@rpi ~$ sudo nano /etc/fail2ban/jail.local
[nginx-w00tw00t]
enabled = true
port = http,https
filter = nginx-w00tw00t
logpath = /var/log/nginx/*access_log
maxretry = 0
bantime = 600
{restart Fail2Ban}
peter@rpi ~$ sudo /etc/init.d/fail2ban restart
9. Security 10 Aspects
Change default username pi & password
Backup !!!
Study logfiles (e.g. with Logwatch)
Block ssh root login !
Block portscans -> Firewall
Block scriptkiddies
SSL certificate for /administrator/
Block phpmyadmin (allow 1 specified IP)
Backup !!!
Passwordless login? SSH shared keys
10. Geeky stuff
10. Geeky Stuff - Webcam
Connect webcam to USB$ sudo apt-get install motion
Configuration$ sudo nano /etc/motion/motion.conf
change: daemon = ON & webcam_localhost = OFF
$ sudo nano /etc/default/motion
change the value start_motion_daemon=no to yes
$ sudo service motion start
Firewall$ sudo iptables -I INPUT -p tcp --dport 8081 -j ACCEPT
RouterPortforwarding port 8081
10. Geeky Stuff - Webcam
Display webcamhttp://192.168.0.9:8081
In Joomla article
No time left for:
Send Email from RPi:Joomla's notifications & contact forms
Logwatch mails
Exim MTA (Mail Transfer Agent)
Questions?
Questions?
Presentation is available at www.db8.nl
Peter Martine-mail: info at db8.nlwebsite: www.db8.nl
Used photos
Chinese Raspberry Pie nr.1 1 - Koen Mol http://www.sxc.hu/photo/346723
Switched On Tech Design - www.sotechdesign.com.au
Bricks - Sharlene Jackson http://www.sxc.hu/photo/759981
Hotrod Dash - Peter Mazurek http://www.sxc.hu/photo/1341923
Greased Lightnin' - Donald Cook http://www.sxc.hu/photo/690214
File Overload - Bob Smith http://www.sxc.hu/photo/367985
Rusted Gears - Angelo Rosa http://www.sxc.hu/photo/1365696
Man Made - "csremedy" http://www.sxc.hu/photo/1267108
digital world - ilker http://www.sxc.hu/photo/1206711
Crazy Man in Shower - scott adams http://www.sxc.hu/photo/760765
laptop 2 - emre nacigil http://www.sxc.hu/photo/810741
Speedometer Abdulhamid AlFadhly http://www.sxc.hu/photo/1390189
Secure - Frank Khne http://www.sxc.hu/photo/962334
Professor Tiger - Gabriel Doyle http://www.sxc.hu/photo/526749
signs signs - Jason Antony, http://www.sxc.hu/photo/751034
Face - Questions - Bob Smith, http://www.sxc.hu/photo/418215
top related