This will only make your api system faster if you have enough cpus to support it.
It should be 1 merb worker per core ( * i think * )
Install Apache and enable the necessary mods
$ apt-get -y install apache2 $ mkdir -p /usr/share/chef-server/public $ for i in rewrite proxy status proxy_http proxy_balancer headers ; do a2enmod $i ; done
Stop Chef-Server
$ /etc/init.d/chef-server stop
Edit your Chef configuration file ( Replace Worker Threads and Port Numbers as needed )
$ sed -i s/PORT=4000/PORT=5000/g /etc/default/chef-server $ echo "WORKERTHREADS=4" | tee -a /etc/default/chef-server
Edit the Chef init script ( Back it up first )
$ cp /etc/init.d/chef-server /etc/init.d/chef-server.original $ sed -i '35s/DAEMON_OPTS="-p/DAEMON_OPTS="-c $WORKERTHREADS -p/g' /etc/init.d/chef-server $ sed -i '42s/(ps/#(ps/g' /etc/init.d/chef-server $ sed -i '/#(ps/ i (ps -fp $pid | egrep -q "merb.*( chef-server .*api.* spawner|worker .* $PORT)") || return 1' /etc/init.d/chef-server
Run diff to see the init script differences
$ diff /etc/init.d/chef-server /etc/init.d/chef-server.original 35c35 < DAEMON_OPTS="-c $WORKERTHREADS -p $PORT -e production -d -a $ADAPTER -P $PIDFILE -L $LOGFILE -C $CONFIG -u $USER -G $GROUP -V" --- > DAEMON_OPTS="-p $PORT -e production -d -a $ADAPTER -P $PIDFILE -L $LOGFILE -C $CONFIG -u $USER -G $GROUP -V" 42,43c42 < (ps -fp $pid | egrep -q "merb.*( chef-server .*api.* spawner|worker .* $PORT)") || return 1 < #(ps -fp $pid | egrep -q "merb.*(merb : master|worker.*$PORT)") || return 1 --- > (ps -fp $pid | egrep -q "merb.*(merb : master|worker.*$PORT)") || return 1
Get variables from your Chef config for apache config construction
$ THREADSCT=$(grep "WORKERTHREADS" /etc/default/chef-server |awk -F"=" '{print $2}') $ NEWCOUNT=$(( THREADSCT -- )) $ PORTPREFIX=$(grep "PORT" /etc/default/chef-server |awk -F"=" '{print $2}'| sed -e s/[0-9][0-9]$//g ) $ MYHOST=$(hostname -f)
Generate Your Apache Config – Generate the Load Balance Members
$ cd /etc/apache2/sites-available $ echo "Listen 4000" |tee -a chef_loadbalancer $ echo '<VirtualHost *:4000>' |tee -a chef_loadbalancer $ echo "ServerName $MYHOST" |tee -a chef_loadbalancer $ echo "" |tee -a chef_loadbalancer $ echo "<Proxy balancer://cheflb>" | tee -a chef_loadbalancer $ seq -w 00 $NEWCOUNT | while read i ; do echo "BalancerMember http://127.0.0.1:${PORTPREFIX}${i}" |tee -a chef_loadbalancer ; done
Append your Apache config with the rest of the relevant information
$ cat>>chef_loadbalancer<<EOF </Proxy> ProxyPass / balancer://cheflb ProxyPassReverse / balancer://cheflb DocumentRoot /usr/share/chef-server/public LogLevel info ErrorLog /var/log/chef/chef_server_apache2-error.log CustomLog /var/log/chef/chef_server_apache2-access.log combined RewriteEngine On RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f RewriteRule ^/(.*)$ balancer://cheflb%{REQUEST_URI} [P,QSA,L] </VirtualHost> EOF
Enable your new apache config and start Apache and Chef-Server
$ a2ensite chef_loadbalancer $ /etc/init.d/apache2 restart $ /etc/init.d/chef-server start
Test your chef server
$ time knife node list $ time knife role list
Reference:
Much of this information was stolen from : http://mrmiller.nonesensedomains.com/2010/06/15/chef-performance-tuning-part-1/
If this technique is outdated please make me aware of it or if my apache configuration is awful ( which i’m sure it is, i’m just too lazy to improve it )