aboutsummaryrefslogtreecommitdiff
path: root/doc/tips/dot_cgi.mdwn
blob: b66406f66e9edc58d9d7f797010cb4d7f05e7267 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
[[!meta date="2009-01-12 20:01:03 -0500"]]

It's common to name the [[cgi]] "ikiwiki.cgi", and put it somewhere
like `~/public_html/ikiwiki.cgi`, or `/var/www/wiki/ikiwiki.cgi`.

If you do that, you may find that when trying to edit a page in your wiki,
you see the raw contents of the ikiwiki.cgi program. Or get a permission
denied problem.

This is because web servers are generally not configured to run cgi scripts
unless they're in `/usr/lib/cgi-bin/`. While you can put ikiwiki.cgi in
there if you like, it's better to configure your web server to 
run `.cgi`  programs from anywhere.

These instructions are for Debian systems, but the basic
configuration changes should work anywhere.

[[!toc]]

## apache 2

* Make sure the cgi module is loaded. (Ie, `a2enmod cgi`).
  Note that the cgid module will not work.

* Edit /etc/apache2/apache2.conf (or /etc/apache2/mods-available/mime.conf)
  and add a line like this:

	AddHandler cgi-script .cgi

* Find the "Options" line for the directory where you've put the
  ikiwiki.cgi, and add "ExecCGI" to the list of options. For example, if
  ikiwiki.cgi is in /var/www/, edit `/etc/apache2/sites-enabled/000-default`
  and add it to the "Options" line in the "Directory /var/www/" stanza.
  Or, if you've put it in a `~/public_html`, edit
  `/etc/apache2/mods-available/userdir.conf`.

* If your wiki is in `~/public_html` and does not appear when you enter the URL given by the installer, check that you have 
  the userdir mod enabled (there should be simlinks to userdir.load and userdir.conf in /etc/apache2/modes-enabled).  If not,
  run `a2enmod userdir` and reload apache2.
  
* You may also want to enable the [[plugins/404]] plugin.
  To make apache use it, the apache config file will need a further
  modification to make it use ikiwiki's CGI as the apache 404 handler.
  Something like this, with the path adjusted to where you've put the CGI:

	ErrorDocument 404 /cgi-bin/ikiwiki.cgi

* On Fedora (and RHEL, CentOS, and derivatives) you may need to change CGI mode from `06755` to `755` as suid/sgid bit is prohibited by `suexec`. ([Bug 1341568](https://bugzilla.redhat.com/show_bug.cgi?id=1341658))

## lighttpd

Here is how to enable cgi on [lighttpd](http://www.lighttpd.net/) and
configure it in order to execute ikiwiki.cgi wherever it is located. 

* Activate cgi by linking `/etc/lighttpd/conf-available/10-cgi.conf` into `/etc/lighttpd/conf-enabled` ([doc](http://trac.lighttpd.net/trac/wiki/Docs%3AModCGI)). 

* Create `/etc/lighttpd/conf-available/90-ikiwiki-cgi.conf` and add a line like this:

    cgi.assign = ( "ikiwiki.cgi"  => "", )

* Activate ikiwiki-cgi by linking `/etc/lighttpd/conf-available/90-ikiwiki-cgi.conf` into `/etc/lighttpd/conf-enabled`. 

* Restart lighttpd server with something like `/etc/init.d/lighttpd restart`.

Note that the first part enables cgi server wide but depending on default
configuration, it may be not enough. The second part creates a specific
rule that allow `ikiwiki.cgi` to be executed.

**Warning:** I only use this lighttpd configuration on my development
server (offline). I am not sure of how secure this approach is.
If you have any thought about it, feel free to let me know.

## nginx

To run CGI under nginx, you need to use a FastCGI wrapper. The wrapper must be started somehow just like any other FastCGI program. You can use launchd on OSX.

In Linux, you will need the spawn-fcgi and fcgiwrap packages and start
them with:

    spawn-fcgi -s /tmp/fcgi.socket -n -- /usr/sbin/fcgiwrap

This needs to be ran as your user. It can be added to `inittab` or
made into a startup script in `init.d`. You may also need to make this file writable by the webserver, if that's running as a different user, e.g.:

    chmod a+w /tmp/fcgi.socket

If you have [systemd](https://en.wikipedia.org/wiki/Systemd), you may use a service file like so:

Edit/create a service file (in Debian it would be: `sudo vim /lib/systemd/system/ikiwiki.service`

Content of `ikiwiki.service`:

    [Unit]
    Description=Ikiwiki fcgi socket wrap
    After=network.target
    
    [Service]
    Type=simple
    User=www-data
    Group=www-data
    ExecStart=/usr/bin/spawn-fcgi -s /tmp/fcgi.socket -n -- /usr/sbin/fcgiwrap
    
    [Install]
    WantedBy=multi-user.target

Then run:

    # This enables the service at startup
    sudo systemctl enable ikiwiki.service
    # This attempts to start the service
    sudo systemctl start ikiwiki.service

Then you need an nginx config plugged in that wrapper. Here's an
example virtual host configuration:

    server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default_server ipv6only=on; ## listen for ipv6

        root /home/anarcat/public_html/wiki.reseaulibre.ca/;
        index index.html index.htm;

        # Make site accessible from http://localhost/
        server_name wiki.reseaulibre.ca;

        location / {
                try_files $uri $uri/ /index.html;
        }
        location /ikiwiki.cgi {
                fastcgi_pass  unix:/tmp/fcgi.socket;
                fastcgi_index ikiwiki.cgi;
                fastcgi_param SCRIPT_FILENAME   /home/anarcat/public_html/ikiwiki.cgi;
                fastcgi_param  DOCUMENT_ROOT      /home/anarcat/public_html/wiki.reseaulibre.ca;
                include /etc/nginx/fastcgi_params;
        }
    }

Also, note that the `/tmp/fcgi.socket` file needs to be writable by the webserver. I am also unsure as to the security of this setup, as I am using this only on my dev server. Needless to say that [[real fastcgi support|todo/fastcgi_or_modperl_installation_instructions]] would be great. ;) --[[anarcat]]

2016-09-23 [[alexjj]]: On Debian Jessie creating the fcgi ikiwiki.service is not necessary. Install fcgiwrap, it'll auto start the fcgiwrap systemd service and then add the parameters in the virtual host:

        location / {
                try_files $uri $uri/ =404;
        }
        
        # Max size of file upload
        client_max_body_size 10m;

        location ~ .cgi {
                #gzip off is recommended in /usr/share/doc/fcgiwrap/README.Debian
                gzip off;
                fastcgi_pass unix:/var/run/fcgiwrap.socket;
                include /etc/nginx/fastcgi_params;
        }

Here's a [[complete site.conf|tips/nginx]] for nginx if that helps.

## boa

Edit /etc/boa/boa.conf and make sure the following line is not commented:

    AddType application/x-httpd-cgi cgi