Saw the slice from Bruce. I was already there.
I have spent some 14 hours on this. I have read the docs on many of the
uwsgi options. I have looked more carefully at the nginx docs. I now get
some diagnostics that tell me much more about what is going on. Along the
way I have learned to hand-author init scripts (somewhat).
Here is what I found out and have done.
1. I believe that cherokee may have installed uwsgi itself or maybe not.
But, I believe I had more than one version of uwsgi installed and
criss-crossing symlinks. Plus, the version that apt-get retrieves for
ubuntu 11.10 is ancient.
2. I completed removed old installs of uwsgi.
3. I installed uwsgi 1.2.3 directly from unbit.it using pip. Unfortunately,
this only builds the binary. You get no config and no init script. But,
you do get a clean up-to-date binary. That is something.
4. Looking at a clean nginx init and several examples of uwsgi init's, I
created one. It evolved and I believe it works.
5. I created a more complete web2py.xml file for uwsgi. There is a lot of
conflicting information flloating around about this that is quite out of
date (Bruce Wade got a bit of it more up to date).
6. I cleaned up my nginx and made sure it served static files so at least I
could be sure that nginx was basically working before I changed the virtual
server definitions to enable uwsgi and web2py. (It did indeed serve
"hello, world!")
But, I still don't think I am that much closer to having this work. I no
longer get 502 bad gateway. I get 504 gateway timeout.
Here is my uwsgi log:
*** Starting uWSGI 1.2.3 (32bit) on [Fri May 18 09:27:27 2012] ***
> compiled with version: 4.6.1 on 17 May 2012 23:33:21
> detected number of CPU cores: 4
> current working directory: /
> writing pidfile to /var/run/uwsgi.pid
> detected binary path: /usr/local/bin/uwsgi
> uWSGI running as root, you can use --uid/--gid/--chroot options
> setgid() to 33
> setuid() to 33
> your memory page size is 4096 bytes
> detected max file descriptor number: 1024
> lock engine: pthread robust mutexes
> uwsgi socket 0 bound to TCP address 127.0.0.1:9001 fd 3
> Python version: 2.7.2+ (default, Oct 4 2011, 20:29:37) [GCC 4.6.1]
> *** Python threads support is disabled. You can enable it with
> --enable-threads ***
> Python main interpreter initialized at 0x9829bd8
> your server socket listen backlog is limited to 100 connections
> *** Operational MODE: no-workers ***
> added /var/web2py/ to pythonpath.
> mounting /var/web2py/wsgihandler.py on /
> WSGI app 0 (mountpoint='/') ready in 0 seconds on interpreter 0x9829bd8
> pid: 25731 (default app)
> spawned uWSGI master process (pid: 25731)
The fact that there are no workers is obviously wrong. I requested 4
processes. I sort of wonder about the working directory. But, I am
launching uwsgi and python and pointing to wsgihandler.py.
Here is the web2py.xml. It looks A LOT different from anything in the
cookbook or slices:
<uwsgi>
> <uid>33</uid>
> <gid>33</gid>
> <pidfile>/var/run/uwsgi.pid</pidfile>
> <pythonpath>/var/web2py/</pythonpath>
> <daemonize>/var/log/uwsgi.log</daemonize>
> <socket>127.0.0.1:9001</socket>
> <processes>4</processes>
> <master/>
> <mount>/=/var/web2py/wsgihandler.py</mount>
> <memory-report/>
> </uwsgi>
Here is the config for nginx (please ignore the port 443 setup--I just
wanted to win one battle before moving on...):
server {
> listen 80;
> server_name $hostname;
> location ~* /(\w+)/static/ {
> root /var/web2py/applications/;
> }
> location / {
> uwsgi_pass 127.0.0.1:9001;
> include uwsgi_params;
> }
> }
> server {
> listen 443;
> server_name $hostname;
> ssl on;
> ssl_certificate /etc/nginx/ssl/web2py.crt;
> ssl_certificate_key /etc/nginx/ssl/web2py.key;
> }
One more suspicious symptom is that when I look at running processes, I
only see the one master for uwsgi:
UID PID PPID C STIME TTY TIME CMD
> root 1 0 0 Mar05 ? 00:00:09 /sbin/init
> root 2 0 0 Mar05 ? 00:00:00 [kthreadd]
> root 3 2 0 Mar05 ? 00:00:32 [ksoftirqd/0]
> root 5 2 0 Mar05 ? 00:00:00 [kworker/u:0]
> root 6 2 0 Mar05 ? 00:00:00 [migration/0]
> root 7 2 0 Mar05 ? 00:00:00 [migration/1]
> root 8 2 0 Mar05 ? 00:00:00 [kworker/1:0]
> root 9 2 0 Mar05 ? 00:00:40 [ksoftirqd/1]
> root 10 2 0 Mar05 ? 00:00:00 [migration/2]
> root 11 2 0 Mar05 ? 00:00:00 [kworker/2:0]
> root 12 2 0 Mar05 ? 00:00:31 [ksoftirqd/2]
> root 13 2 0 Mar05 ? 00:00:00 [migration/3]
> root 14 2 0 Mar05 ? 00:00:00 [kworker/3:0]
> root 15 2 0 Mar05 ? 00:00:40 [ksoftirqd/3]
> root 16 2 0 Mar05 ? 00:00:00 [cpuset]
> root 17 2 0 Mar05 ? 00:00:00 [khelper]
> root 18 2 0 Mar05 ? 00:00:00 [kworker/u:1]
> root 22 2 0 Mar05 ? 00:00:00 [xenwatch]
> root 23 2 0 Mar05 ? 00:00:00 [xenbus]
> root 149 2 0 Mar05 ? 00:00:18 [sync_supers]
> root 151 2 0 Mar05 ? 00:00:00 [bdi-default]
> root 153 2 0 Mar05 ? 00:00:00 [kblockd]
> root 163 2 0 Mar05 ? 00:00:00 [md]
> root 247 2 0 Mar05 ? 00:00:00 [rpciod]
> root 248 2 0 Mar05 ? 00:02:37 [kworker/2:1]
> root 280 2 0 Mar05 ? 00:00:01 [kswapd0]
> root 281 2 0 Mar05 ? 00:00:00 [ksmd]
> root 282 2 0 Mar05 ? 00:00:00 [fsnotify_mark]
> root 286 2 0 Mar05 ? 00:00:00 [ecryptfs-kthrea]
> root 288 2 0 Mar05 ? 00:00:00 [nfsiod]
> root 291 2 0 Mar05 ? 00:00:00 [jfsIO]
> root 292 2 0 Mar05 ? 00:00:00 [jfsCommit]
> root 293 2 0 Mar05 ? 00:00:00 [jfsCommit]
> root 294 2 0 Mar05 ? 00:00:00 [jfsCommit]
> root 295 2 0 Mar05 ? 00:00:00 [jfsCommit]
> root 296 2 0 Mar05 ? 00:00:00 [jfsSync]
> root 297 2 0 Mar05 ? 00:00:00 [xfs_mru_cache]
> root 298 2 0 Mar05 ? 00:00:00 [xfslogd]
> root 299 2 0 Mar05 ? 00:00:00 [xfsdatad]
> root 300 2 0 Mar05 ? 00:00:00 [xfsconvertd]
> root 301 2 0 Mar05 ? 00:00:00 [glock_workqueue]
> root 302 2 0 Mar05 ? 00:00:00 [delete_workqueu]
> root 303 2 0 Mar05 ? 00:00:00 [gfs_recovery]
> root 304 2 0 Mar05 ? 00:00:00 [crypto]
> root 866 2 0 Mar05 ? 00:00:00 [khvcd]
> root 968 2 0 Mar05 ? 00:01:43 [kworker/0:1]
> root 981 2 0 Mar05 ? 00:00:00 [kpsmoused]
> root 982 2 0 Mar05 ? 00:05:35 [kworker/1:1]
> root 1009 2 0 Mar05 ? 00:01:37 [kjournald]
> root 1038 1 0 Mar05 ? 00:00:00 upstart-udev-bridge
> --daemon
> root 1913 2 0 Mar05 ? 00:03:32 [kworker/3:1]
> root 1933 1 0 Mar05 ? 00:00:00 upstart-socket-bridge
> --daemon
> root 1974 1 0 Mar05 ? 00:00:00 dhclient3 -e IF_METRIC=100
> -pf /var/run/dhclient.eth0.pid -lf /var/lib/dhcp3/dhclient.eth0.leases -1
> eth0
> root 1995 1 0 Mar05 ? 00:01:25 /usr/sbin/sshd -D
> syslog 2029 1 0 Mar05 ? 00:10:58 rsyslogd -c5
> 102 2032 1 0 Mar05 ? 00:00:00 dbus-daemon --system
> --fork --activation=upstart
> daemon 2079 1 0 Mar05 ? 00:00:00 atd
> root 2080 1 0 Mar05 ? 00:00:11 cron
> root 2201 2 0 Mar05 ? 00:00:39 [flush-202:0]
> root 2268 1 0 Mar05 hvc0 00:00:00 /sbin/getty -8 38400 hvc0
> ntp 2318 1 0 Mar05 ? 00:06:18 /usr/sbin/ntpd -p
> /var/run/ntpd.pid -g -u 105:110
> root 17087 2 0 Apr07 ? 00:00:54 [kworker/0:2]
> root 22656 1995 0 05:11 ? 00:00:01 sshd: root@pts/0
> root 22671 22656 0 05:11 pts/0 00:00:00 -bash
> root 23855 1995 0 06:55 ? 00:00:00 sshd: root@notty
> root 23870 23855 0 06:55 ? 00:00:00
> /usr/lib/openssh/sftp-server
> www-data 25731 1 0 09:27 ? 00:00:00 /usr/local/bin/uwsgi -x
> /etc/uwsgi/uwsgi-conf.xml -p /var/run/uwsgi.pid
> root 25752 1 0 09:28 ? 00:00:00 nginx: master process
> /usr/sbin/nginx
> www-data 25753 25752 0 09:28 ? 00:00:00 nginx: worker process
> www-data 25754 25752 0 09:28 ? 00:00:00 nginx: worker process
> www-data 25755 25752 0 09:28 ? 00:00:00 nginx: worker process
> www-data 25756 25752 0 09:28 ? 00:00:00 nginx: worker process
> root 26018 22671 0 09:59 pts/0 00:00:00 ps -ef
> postgres 29498 1 0 May16 ? 00:00:18
> /usr/lib/postgresql/9.1/bin/postgres -D /var/lib/postgresql/9.1/main -c
> config_file=/etc/postgresql/9.1/main/postgresql.conf
> postgres 29500 29498 0 May16 ? 00:00:19 postgres: writer process
>
>
> postgres 29501 29498 0 May16 ? 00:00:18 postgres: wal writer
> process
>
> postgres 29502 29498 0 May16 ? 00:00:15 postgres: autovacuum
> launcher process
>
> postgres 29503 29498 0 May16 ? 00:00:26 postgres: stats collector
> process
>
> mysql 29796 1 0 May16 ? 00:00:25 /usr/sbin/mysqld
> root 29855 1 0 May16 ? 00:00:00 udevd --daemon
That's the news from Lake Woebegone.
On the surface, nginx looks much easier to set up than apache. But, uwsgi
seems much more difficult than mod_wsgi.
Thanks for everyone's help.