Page 1 of 2 12 LastLast
Results 1 to 25 of 34
  1. #1
    Join Date
    Oct 2010
    Location
    USA
    Posts
    44

    nginx + php-fpm + debian squeeze tutorial - the fastest way to host php!

    Here is a quick howto for setting up nginx and php-fpm on a Debian 6 VPS. We will be using the dotdeb repository for this so a big thanks goes to the dotdeb guys for building such reliable Debian packages.

    This has been tested on a Debian 6 OpenVZ minimal template:

    First add the dotdeb repo to your sources.list file:
    Code:
    nano /etc/apt/sources.list
    add this to the bottom of the file:
    Code:
    deb http://packages.dotdeb.org stable all
    Next, add the GnuPG key to your distribution:
    Code:
    wget http://www.dotdeb.org/dotdeb.gpg
    cat dotdeb.gpg | sudo apt-key add -
    rm dotdeb.gpg
    Update APT:
    Code:
    apt-get update
    Install php and php-fpm plus some common addons:
    Code:
    apt-get install php5 php5-fpm php-pear php5-common php5-mcrypt php5-mysql php5-cli php5-gd
    Install nginx:
    Code:
    apt-get install nginx
    Tweak the php-fpm configuration:
    Code:
    nano /etc/php5/fpm/php5-fpm.conf
    The following tweaks have been customized for a 512MB-1GB VPS. You can use the same numbers here or come up with your own. This is just what I have found to be the most resource friendly for a lightly used VPS:
    Code:
    pm.max_children = 25
    pm.start_servers = 4
    pm.min_spare_servers = 2
    pm.max_spare_servers = 10
    pm.max_requests = 500
    This line is optional but I highly suggest you use it. Basically it's saying that if a php-fpm process hangs it will terminate it if it continues to hang for 30 seconds. This will add stability and reliability to your php application in the event there is a problem:
    Code:
    request_terminate_timeout = 30s
    restart php-fpm:
    Code:
    /etc/init.d/php5-fpm restart
    Tweak your nginx configuration:
    Code:
    nano /etc/nginx/nginx.conf
    The client_max_body_size option changes the max from the 1MB default (which is a must for most php apps):
    Code:
    client_max_body_size 20M;
    client_body_buffer_size 128k;
    Remove the default vhost symlink:
    Code:
    cd /etc/nginx/sites-enabled
    rm default
    Create a fresh and clean vhost file:
    Code:
    nano /etc/nginx/sites-available/www.website.com
    Code:
    server {
                    listen 80;
                    server_name website.com www.website.com;
    
                    access_log /var/log/nginx/website.access_log;
                    error_log /var/log/nginx/website.error_log;
    
                    root /var/www/www.website.com;
                    index index.php index.htm index.html;
    
                    location ~ .php$ {
                      fastcgi_pass   127.0.0.1:9000;
                      fastcgi_index  index.php;
                      fastcgi_param  SCRIPT_FILENAME /var/www/www.website.com$fastcgi_script_name;
                      include fastcgi_params;
                    }
           }
    Create a new symlink for the new vhost under sites-enabled:
    Code:
    ln -s /etc/nginx/sites-available/www.website.com /etc/nginx/sites-enabled/www.website.com
    Restart nginx:
    Code:
    /etc/init.d/nginx restart
    That's it. You should now have a clean installation of nginx and php-fpm with a single vhost running on port 80. If you want to have the same vhost running with ssl on port 443, copy and paste the entire vhost code into the bottom of the vhost file, change 'listen' to 443:
    Code:
                    listen 443;
    Then add these lines that will point to your ssl certs:
    Code:
                    ssl on;
                    ssl_certificate /path/to/certificate/www.website.com.crt;
                    ssl_certificate_key /path/to/certificate_key/www.website.com.key;
    Please let me know if there is anything I missed or anything that might need to be changed.
    AltruHost - Our Public Beta has been announced!!! - A webhost on the Rise... Altruism AKA Selflessness AKA The Golden Rule. That is what AltruHost is all about.
    http://www.altruhost.com - Like Us on Facebook - Follow Us on Twitter

  2. Thread Summary This thread contains a tutorial or howto for setting up nginx and php-fpm on a Debian 6 VPS.

    This has been tested on a Debian 6 OpenVZ minimal template:

    First add the dotdeb repo to your sources.list file:
    Code:
    nano /etc/apt/sources.list
    add this to the bottom of the file:
    Code:
    deb http://packages.dotdeb.org stable all
    Next, add the GnuPG key to your distribution:
    Code:
    wget http://www.dotdeb.org/dotdeb.gpg
    cat dotdeb.gpg | sudo apt-key add -
    rm dotdeb.gpg
    Update APT:
    Code:
    apt-get update
    Install php and php-fpm plus some common addons:
    Code:
    apt-get install php5 php5-fpm php-pear php5-common php5-mcrypt php5-mysql php5-cli php5-gd
    Install nginx:
    Code:
    apt-get install nginx
    Tweak the php-fpm configuration:
    Code:
    nano /etc/php5/fpm/php5-fpm.conf
    The following tweaks have been customized for a 512MB-1GB VPS. You can use the same numbers here or come up with your own. This is just what I have found to be the most resource friendly for a lightly used VPS:
    Code:
    pm.max_children = 25
    pm.start_servers = 4
    pm.min_spare_servers = 2
    pm.max_spare_servers = 10
    pm.max_requests = 500
    This line is optional but I highly suggest you use it. Basically it's saying that if a php-fpm process hangs it will terminate it if it continues to hang for 30 seconds. This will add stability and reliability to your php application in the event there is a problem:
    Code:
    request_terminate_timeout = 30s
    restart php-fpm:
    Code:
    /etc/init.d/php5-fpm restart
    Tweak your nginx configuration:
    Code:
    nano /etc/nginx/nginx.conf
    The client_max_body_size option changes the max from the 1MB default (which is a must for most php apps):
    Code:
    client_max_body_size 20M;
    client_body_buffer_size 128k;
    Remove the default vhost symlink:
    Code:
    cd /etc/nginx/sites-enabled
    rm default
    Create a fresh and clean vhost file:
    Code:
    nano /etc/nginx/sites-available/www.website.com
    Code:
    server {
                    listen 80;
                    server_name website.com www.website.com;
    
                    access_log /var/log/nginx/website.access_log;
                    error_log /var/log/nginx/website.error_log;
    
                    root /var/www/www.website.com;
                    index index.php index.htm index.html;
    
                    location ~ .php$ {
                      fastcgi_pass   127.0.0.1:9000;
                      fastcgi_index  index.php;
                      fastcgi_param  SCRIPT_FILENAME /var/www/www.website.com$fastcgi_script_name;
                      include fastcgi_params;
                    }
           }
    Create a new symlink for the new vhost under sites-enabled:
    Code:
    ln -s /etc/nginx/sites-available/www.website.com /etc/nginx/sites-enabled/www.website.com
    Restart nginx:
    Code:
    /etc/init.d/nginx restart
    That's it. You should now have a clean installation of nginx and php-fpm with a single vhost running on port 80. If you want to have the same vhost running with ssl on port 443, copy and paste the entire vhost code into the bottom of the vhost file, change 'listen' to 443:
    Code:
                    listen 443;
    Then add these lines that will point to your ssl certs:
    Code:
                    ssl on;
                    ssl_certificate /path/to/certificate/www.website.com.crt;
                    ssl_certificate_key /path/to/certificate_key/www.website.com.key;
    The thread has some discussions highlighting specific challenges. You're encouraged to read the entire thread if the steps outlined don't work for you.

    Contributors: SoftWareRevue

  3. #2
    Thanks for share.

  4. #3
    Join Date
    Jul 2010
    Location
    Australia
    Posts
    151
    Good information for beginners or ones that need help.

    I hope you continue to share more.

  5. #4
    thanks for sharing, it certinaly helped me out

  6. #5
    Join Date
    Oct 2010
    Location
    USA
    Posts
    44
    You are all most welcome! I hope more people can benefit from tutorials like this. I plan on posting more here in the future.
    AltruHost - Our Public Beta has been announced!!! - A webhost on the Rise... Altruism AKA Selflessness AKA The Golden Rule. That is what AltruHost is all about.
    http://www.altruhost.com - Like Us on Facebook - Follow Us on Twitter

  7. #6
    Hey, Thanks for the nice tut.

    I'm not a Linux noob, but I'm new to Dotdeb and some of the steps here are new to me. Namely this one

    Tweak the php-fpm configuration:
    Code:
    nano /etc/php5/fpm/php5-fpm.conf
    I followed your steps from the start, and I don't have this file in the /etc/php5/fpm/ directory. But there is a php-fpm.conf file there. Should I be adding these settings to that file, or creating php5-fpm.conf?

    Cheers
    Aaron

  8. #7
    Join Date
    Oct 2010
    Location
    USA
    Posts
    44
    Hey thanks for pointing that out. That might actually be a typo. I'll have to look at my configs later to see but typically the file is called php-fpm.conf. Try editing that file and continue on. You shouldn't have any more problems from there.

  9. #8
    Join Date
    Oct 2010
    Location
    USA
    Posts
    44

    Update:

    Okay, so I've checked my configuration and my servers actually have a file called 'php5-fpm.conf' so perhaps the dotdeb binaries have changed to use the 'php-fpm.conf' file name instead... Try editing that file and if you could report back if it works that would be great. If not then just copy the file or symlink it and see if that works as well.

  10. #9
    What else would I need to install other than MySQL to get wordpress working?

    Thanks

  11. #10
    Join Date
    Oct 2010
    Location
    Iraq
    Posts
    214
    @OP thanks for this informative tutorial
    @thomas01155 nothing else (nginx + php-fpm + mysql) is what you need to run Wordpress
    www.xsltel.com
    Simplest way to host your website
    GitHub

  12. #11
    Thanks, I have my wordpress site working now. I keep getting 502 bad gate way errors when I update stuff on the site however. Do you know how to fix this?

    Thanks,
    Tom

  13. #12
    Join Date
    Apr 2010
    Location
    North Carolina
    Posts
    430

  14. #13
    OK so now its but I'm still getting the same error

    location ~ .php$ {
    if (-f $request_filename) {
    fastcgi_pass 127.0.0.1:9000;
    }
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/*removed*.com$fastcgi_script_name;
    include fastcgi_params;
    }

    2011/05/23 00:43:40 [error] 1987#0: *15 readv() failed (104: Connection reset by peer) while reading upstream, client: 11.111.11.11, server: *remove*.com, request: "GET /wp-admin/index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "*remove*.com", referrer: "http://*remove*.com/wp-admin/profile.php"
    2011/05/23 00:43:42 [error] 1987#0: *15 readv() failed (104: Connection reset by peer) while reading upstream, client: 11.111.11.11, server: *remove*.com, request: "GET /wp-admin/edit.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "*remove*.com", referrer: "http://*remove*.com/wp-admin/index.php"
    2011/05/23 00:43:44 [error] 1987#0: *15 readv() failed (104: Connection reset by peer) while reading upstream, client: 11.111.11.11, server: *remove*.com, request: "GET /wp-admin/post.php?post=1&action=edit HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "*remove*.com", referrer: "http://*remove*.com/wp-admin/edit.php"
    2011/05/23 00:43:46 [error] 1987#0: *21 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 11.111.11.11, server: *remove*.com, request: "POST /wp-admin/post.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "*remove*.com", referrer: "http://*remove*.com/wp-admin/post.php?post=1&action=edit"
    2011/05/23 00:43:48 [error] 1987#0: *21 readv() failed (104: Connection reset by peer) while reading upstream, client: 11.111.11.11, server: *remove*.com, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "*remove*.com"
    2011/05/23 00:43:51 [error] 1987#0: *21 readv() failed (104: Connection reset by peer) while reading upstream, client: 11.111.11.11, server: *remove*.com, request: "GET /wp-admin/profile.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "*remove*.com", referrer: "http://*remove*.com/"
    2011/05/23 00:43:53 [error] 1987#0: *21 readv() failed (104: Connection reset by peer) while reading upstream, client: 11.111.11.11, server: *remove*.com, request: "GET /wp-admin/edit.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "*remove*.com", referrer: "http://*remove*.com/wp-admin/profile.php"
    2011/05/23 00:43:57 [error] 1987#0: *21 readv() failed (104: Connection reset by peer) while reading upstream, client: 11.111.11.11, server: *remove*.com, request: "GET /wp-admin/edit.php?post_type=page HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "*remove*.com", referrer: "http://*remove*.com/wp-admin/edit.php"
    2011/05/23 00:43:59 [error] 1987#0: *21 readv() failed (104: Connection reset by peer) while reading upstream, client: 11.111.11.11, server: *remove*.com, request: "GET /wp-admin/post.php?post=5&action=edit HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "*remove*.com", referrer: "http://*remove*.com/wp-admin/edit.php?post_type=page"
    2011/05/23 00:44:00 [error] 1987#0: *21 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 11.111.11.11, server: *remove*.com, request: "POST /wp-admin/post.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "*remove*.com", referrer: "http://*remove*.com/wp-admin/post.php?post=5&action=edit"

    netstat -nl
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
    tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
    tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
    tcp 0 0 127.0.0.1:587 0.0.0.0:* LISTEN
    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
    tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
    tcp6 0 0 :::22 :::* LISTEN
    raw6 0 0 :::1 :::* 7
    Active UNIX domain sockets (only servers)
    Proto RefCnt Flags Type State I-Node Path
    unix 2 [ ACC ] STREAM LISTENING 716910858 /var/run/mysqld/mysqld.sock
    unix 2 [ ACC ] STREAM LISTENING 716887395 /var/run/saslauthd/mux
    unix 2 [ ACC ] STREAM LISTENING 716887911 /var/run/sendmail/mta/smcontrol

    Thanks,
    Tom
    Last edited by thomas01155; 05-22-2011 at 04:53 PM. Reason: more information

  15. #14
    Here are some more logs if anyone can help me solve this problem

    php5-fpm.log
    [23-May-2011 01:16:49] WARNING: [pool www] child 3574 exited on signal 11 (SIGSEGV) after 62.058702 seconds from start
    [23-May-2011 01:16:49] NOTICE: [pool www] child 3597 started
    [23-May-2011 01:16:57] WARNING: [pool www] child 3575 exited on signal 11 (SIGSEGV) after 67.750219 seconds from start

    user.log
    May 22 23:47:51 V-1040 suhosin[3173]: ALERT - script tried to increase memory_limit to 268435456 bytes which is above the allowed value (attacker 'xx.xxx.xx.xx', file '/var/www/xx***********/wp-admin/admin.php', line 109)
    May 22 23:47:53 V-1040 suhosin[3177]: ALERT - script tried to increase memory_limit to 268435456 bytes which is above the allowed value (attacker 'xx.xxx.xx.xx', file '/var/www/xx***********/wp-admin/admin.php', line 109)
    May 22 23:53:26 V-1040 suhosin[3175]: ALERT - script tried to increase memory_limit to 268435456 bytes which is above the allowed value (attacker 'xx.xxx.xx.xx', file '/var/www/xx***********/wp-admin/admin.php', line 109)
    May 22 23:53:27 V-1040 suhosin[3178]: ALERT - script tried to increase memory_limit to 268435456 bytes which is above the allowed value (attacker 'xx.xxx.xx.xx', file '/var/www/xx***********/wp-admin/admin.php', line 109)
    May 22 23:53:29 V-1040 suhosin[3184]: ALERT - script tried to increase memory_limit to 268435456 bytes which is above the allowed value (attacker 'xx.xxx.xx.xx', file '/var/www/xx***********/wp-admin/admin.php', line 109)
    May 22 23:53:31 V-1040 suhosin[3186]: ALERT - script tried to increase memory_limit to 268435456 bytes which is above the allowed value (attacker 'xx.xxx.xx.xx', file '/var/www/xx***********/wp-admin/admin.php', line 109)

    Thanks

  16. #15
    Join Date
    Oct 2010
    Location
    USA
    Posts
    44
    Did you see this thread:
    http://serverfault.com/questions/178...-on-a-test-ser

    It suggests that this could be a configuration problem and that this line in nginx.conf will fix it:
    Code:
    request_terminate_timeout = 30s
    The above is in the walkthough but it is suggested as optional so perhaps you opted to ignore that part of the config.

    Also, how much memory do you have and how much is free? Simply run:
    Code:
    free -m
    The suhosin error messages look familiar and depending on the configuration I think it can be ignored (but don't quote me on that)

    If you are still experiencing problems after triple checking your configs and free memory I'd be glad to help you further.
    AltruHost - Our Public Beta has been announced!!! - A webhost on the Rise... Altruism AKA Selflessness AKA The Golden Rule. That is what AltruHost is all about.
    http://www.altruhost.com - Like Us on Facebook - Follow Us on Twitter

  17. #16
    Join Date
    Oct 2010
    Location
    USA
    Posts
    44
    Also I am noting that you have this in your configuration:

    Code:
    location ~ .php$ {
    if (-f $request_filename) {
    fastcgi_pass 127.0.0.1:9000;
    }
    If you are indeed running Debian 6 then your version of nginx should support the 'try_files' directive and as long as you are proxying to php-fpm locally then you should be good to use it.

    You should no longer use the depreciated if statements inside of a location block as per this article on the nginx wiki:

    http://wiki.nginx.org/IfIsEvil

    It explicitly says on the above page:

    The only safe things may be done inside if in location context are:

    return ...;
    rewrite ... last;

    Anything else may cause unpredictable results up to SIGSEGV.
    ...so most likely this is the cause of your problem
    AltruHost - Our Public Beta has been announced!!! - A webhost on the Rise... Altruism AKA Selflessness AKA The Golden Rule. That is what AltruHost is all about.
    http://www.altruhost.com - Like Us on Facebook - Follow Us on Twitter

  18. #17
    OK, this is my new virtual host config file for my site:
    location ~ .php$ {
    try_files $uri =404;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/xxxxxxxxxx.co.cc$fastcgi_script_name;
    include fastcgi_params;
    }
    I have these 3 files in /etc/php5/fpm/

    /etc/php5/fpm/php5-fpm.conf
    pm.max_children = 25
    pm.start_servers = 4
    pm.min_spare_servers = 2
    pm.max_spare_servers = 10
    pm.max_requests = 500
    request_terminate_timeout = 30s
    /etc/php5/fpm/php-fpm.conf
    http://pastebin.com/RzJjMK6K
    I noticed this ;include=/etc/php5/fpm/*.conf is commented. I tried uncommenting it but php5-fpm fails to restart when I do that. So is it even reading my php5-fpm.conf?
    Restarting PHP5 FastCGI Process Manager: php5-fpm failed!
    I moved the php.ini from cli to here
    /etc/php5/fpm/php.ini
    free -m
    total used free shared buffers cached
    Mem: 2048 190 1857 0 0 0
    -/+ buffers/cache: 190 1857
    Swap: 0 0 0
    Thanks again,
    Tom

    PS: I very new to all of this, so thank you again for your help : )
    Last edited by thomas01155; 05-23-2011 at 04:26 AM.

  19. #18
    This is my nginx.conf if it helps: http://pastebin.com/3Qv084Jw
    Do I need a block with upstream php {}?

    I can't get my site to load at all, I just get 502 Bad Gateway everytime now. I don't know why it managed to load for a bit yesterday.

    Thanks
    Last edited by thomas01155; 05-23-2011 at 05:02 AM.

  20. #19
    Is php5-fpm.conf meant to be in /etc/php5/fpm/pool.d/ folder?

    I have /etc/php5/fpm/pool.d/www.conf inside the pool.d folder.

    I'm so

  21. #20
    OK, I have it working after all day trying to get it to xD I put all the tweaks in: /etc/php5/fpm/pool.d/www.conf and the line php_admin_value[memory_limit] = 256M

    Thanks xx

  22. #21
    Join Date
    Oct 2010
    Location
    USA
    Posts
    44
    Is php5-fpm.conf meant to be in /etc/php5/fpm/pool.d/ folder?
    NO php5-fpm.conf should be left in its default location!

    It sounds like you may have it working now but if you need any help please respond back to this thread.
    AltruHost - Our Public Beta has been announced!!! - A webhost on the Rise... Altruism AKA Selflessness AKA The Golden Rule. That is what AltruHost is all about.
    http://www.altruhost.com - Like Us on Facebook - Follow Us on Twitter

  23. #22
    Quote Originally Posted by AltruHost View Post
    NO php5-fpm.conf should be left in its default location!

    It sounds like you may have it working now but if you need any help please respond back to this thread.
    Is there a better way other than using line php_admin_value[memory_limit] = 256M I don't even know what it does, it just seems to work.

    I'm using like 600mb of RAM with like 0 visitors.

  24. #23
    My used memory just seems to keep increasing till I get the gateway error

    total used free shared buffers cached
    Mem: 2048 703 1344 0 0 0
    -/+ buffers/cache: 703 1344
    Swap: 0 0 0

  25. #24
    Quote Originally Posted by thomas01155 View Post
    My used memory just seems to keep increasing till I get the gateway error

    total used free shared buffers cached
    Mem: 2048 703 1344 0 0 0
    -/+ buffers/cache: 703 1344
    Swap: 0 0 0
    Some of my server min and max settings were wrong seems to be holding around 275MB at the moment.

  26. #25
    Join Date
    Oct 2010
    Location
    USA
    Posts
    44
    No you do not need to set php_admin_value[memory_limit] to any value. Just leave this line commented out for the default value to take affect. Also, you are right about the min and max server count. If you leave the default setting for child processes as dynamic:
    Code:
    pm = dynamic
    then you will need to make sure your pm.start_servers pm.min_spare_servers and pm.max_spare_servers values are appropriate for your memory configuration.

    There are example values for those settings in the walkthough on page 1 of this thread and if you have 2GB of memory like your posts show then those values should work quite nicely.

    However, if you are experiencing high memory usage simply adjust each of those settings down until you get an exceptable amount of memory usage.

    You can also check to see exactly how many php-fpm processes are being spawned with this command:

    Code:
    ps -A | grep php-fpm
    Also, you can see how much memory each process is taking up by running:

    Code:
    top
    You can switch column by pressing shift + > or shift + <

    Typically when using top, the RES column is the most accurate for actual memory usage whether it's cached, shared, etc.
    Last edited by AltruHost; 05-23-2011 at 06:35 PM. Reason: more info...
    AltruHost - Our Public Beta has been announced!!! - A webhost on the Rise... Altruism AKA Selflessness AKA The Golden Rule. That is what AltruHost is all about.
    http://www.altruhost.com - Like Us on Facebook - Follow Us on Twitter

Page 1 of 2 12 LastLast

Similar Threads

  1. nginx + php-fpm shared hosting
    By AltruHost in forum Web Hosting
    Replies: 19
    Last Post: 03-04-2011, 08:33 AM
  2. nginx and php installation on Debian tutorial
    By fb904 in forum Hosting Security and Technology
    Replies: 3
    Last Post: 07-27-2010, 03:05 PM
  3. nginx with php-fpm troubles
    By whdev in forum Hosting Security and Technology
    Replies: 4
    Last Post: 04-10-2010, 01:52 PM
  4. Replies: 2
    Last Post: 01-15-2010, 02:01 PM
  5. Apache vs Nginx (mod_php VS php-fpm)
    By bostjan in forum Hosting Security and Technology
    Replies: 7
    Last Post: 06-25-2009, 07:19 AM

Related Posts from theWHIR.com

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •