Tuesday, December 11, 2012

Running webtoolkit application as nginx FastCGI on CentOS 6.x

Wt (pronounced as witty) is a powerful C++ library for developing web applications. Witty-based apps can be integrated as FastCGI with nginx and other web servers. This guide is about the integration of witty w/ nginx on CentOS 6.x OS.

On this how to, we'll be using the simplest witty example: hello

I assumed you already had installed a CentOS 6.x minimal x86_64.

The Steps

  1. Login as a sudoer user.
  2. Append EPEL repository by creating the file /etc/yum.repos.d/epel.repo with the following content:
  3. [epel]
    name=Extra Packages for Enterprise Linux 6 - $basearch
    #baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
    mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
    failovermethod=priority
    enabled=1
    gpgcheck=0
    
  4. Install required packages: nginx, witty and CentOS development kit:
  5. $ sudo yum install nginx 
    $ sudo yum install wt
    $ sudo yum install fcgi
    $ sudo yum install spawn-fcgi
    $ sudo yum install wt-devel wt-examples      # Only for development env
    $ sudo yum groupinstall "Development Tools"  # Only for development env
    $ sudo yum install nano                      # Only for development env
    
  6. Go to Wt's examples directory and edit the CMakeLists.txt archive:
  7. $ cd /usr/lib64/Wt/examples/hello
    $ sudo nano CMakeLists.txt
    
    and replace
    WT_ADD_EXAMPLE(hello.wt hello.C)
    by:
    ADD_EXECUTABLE(hello.wt hello.C)
    TARGET_LINK_LIBRARIES(hello.wt ${EXAMPLES_CONNECTOR})
    
  8. Run CMake specifying FastCGI support & copy resulting binary to nginx document root:
  9. $ sudo rm -rf target
    $ sudo mkdir -p target
    $ cd target
    $ sudo cmake ../ -DEXAMPLES_CONNECTOR=wtfcgi -DCONNECTOR_FCGI=yes -DCONNECTOR_HTTP=no 
    $ sudo make
    $ sudo cp -a hello.wt /usr/share/nginx/html/
    
  10. Create a new archive /etc/sysconfig/spawn-fcgi-hello.wt with the following content:
  11. FCGI_SOCKET=/var/run/hello.wt.socket
    FCGI_PROGRAM=/usr/share/nginx/html/hello.wt
    FCGI_USER=nginx
    FCGI_GROUP=nginx
    FCGI_EXTRA_OPTIONS="-M 0700"
    OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/hello.wt.socket.pid -- $FCGI_PROGRAM"
  12. Allow nginx to write at /var/spool/wt/run/:
  13. $ sudo chgrp nginx /var/spool/wt/run/
    $ sudo chmod g+w /var/spool/wt/run/
  14. Launch hello app via spawn-fcgi:
  15. $ source /etc/sysconfig/spawn-fcgi-hello.wt
    $ spawn-fcgi $OPTIONS
    
    now the FastCGI is running and waiting.
  16. Create a new file /etc/nginx/conf.d/wt.conf w/ the following content:
  17. server {
        listen  9091;
        server_name  _;
    
        # by default relative to /usr/share/nginx/html
        location / {
          access_log /var/log/nginx/nginx-fastcgi-access.log;
          gzip off;
    
          # the full path /usr/share/nginx/html/hello.wt
          if ($uri !~ "^/hello.wt/$") {
            fastcgi_pass unix:/var/run/hello.wt.socket;
          }
          include /etc/nginx/fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }
    
  18. Restart nginx:
  19. $ service ngnix restart
    
  20. Visit http://HOST:9091 and enjoy it!

5 comments:

  1. Thank-you for posting this!

    When I do "sudo make" in step 5, the first of many errors is "/usr/include/Wt/WApplication:22:25: error: boost/any.hpp: No such file or directory", but when I do "yum install boost" I get "Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
    * base: centos.mirror.freedomvoice.com
    * epel: linux.mirrors.es.net
    * extras: mirrors.easynews.com
    * updates: centos.mirrors.hoobly.com
    Setting up Install Process
    Package boost-1.41.0-11.el6_1.2.x86_64 already installed and latest version
    Nothing to do"

    Do you know what to do? Thanks again!

    ReplyDelete
    Replies
    1. The former package includes /usr/include/boost/any.hpp. I forgot to include it in the installation steps.

      Just run:

      $ yum install boost-devel


      Thanks for the feedback!

      Delete
  2. I appreciate the detailed research and thoughtful presentation.azure devops course

    ReplyDelete
  3. An IBM DataStage course provides comprehensive knowledge of enterprise ETL solutions and large-scale data integration. This ibm datastage course covers DataStage architecture, job design, data transformation, debugging, and deployment strategies. Learners gain practical exposure through live projects and coding exercises.

    ReplyDelete
  4. Thanks for sharing this useful information about MuleSoft online training. A well-designed online course can help developers understand API development, data integration, and automation while building valuable skills for a career in enterprise integration.

    mulesoft online training

    ReplyDelete