wsgi.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import multiprocessing
  2. import yaml
  3. from os import environ, makedirs, path
  4. import gunicorn.app.base
  5. from lakesuperior.config_parser import default_config_dir
  6. from lakesuperior.env import env
  7. config_file = '{}/gunicorn.yml'.format(default_config_dir)
  8. with open(config_file, 'r') as fh:
  9. config = yaml.load(fh, yaml.SafeLoader)
  10. listen_addr = config.get('listen_addr', '0.0.0.0')
  11. listen_port = config.get('listen_port', 8000)
  12. preload_app = config.get('preload_app', True)
  13. app_mode = config.get('app_mode', 'prod')
  14. data_dir = path.realpath(config.get('data_dir'))
  15. run_dir = '{}/run'.format(data_dir)
  16. log_dir = '{}/log'.format(data_dir)
  17. makedirs(log_dir, exist_ok=True)
  18. makedirs(run_dir, exist_ok=True)
  19. def default_workers():
  20. return (multiprocessing.cpu_count() * 2) + 1
  21. options = {
  22. 'bind': '{}:{}'.format(listen_addr, listen_port),
  23. 'workers': config.get('workers', default_workers()),
  24. 'worker_class': config.get('worker_class', 'gevent'),
  25. 'max_requests': config.get('max_requests', 512),
  26. 'user': config.get('user'),
  27. 'group': config.get('group'),
  28. 'raw_env': 'APP_MODE={}'.format(app_mode),
  29. 'preload_app': preload_app,
  30. 'daemon': app_mode=='prod',
  31. 'reload': app_mode=='dev' and not preload_app,
  32. 'pidfile': '{}/fcrepo.pid'.format(run_dir),
  33. 'accesslog': '{}/gunicorn-access.log'.format(log_dir),
  34. 'errorlog': '{}/gunicorn-error.log'.format(log_dir),
  35. }
  36. env.wsgi_options = options
  37. class WsgiApp(gunicorn.app.base.BaseApplication):
  38. def __init__(self, app, options={}):
  39. self.options = options
  40. self.application = app
  41. super(WsgiApp, self).__init__()
  42. def load_config(self):
  43. for key, value in self.options.items():
  44. self.cfg.set(key.lower(), value)
  45. def load(self):
  46. return self.application
  47. def run():
  48. from lakesuperior.server import fcrepo
  49. WsgiApp(fcrepo, options).run()
  50. if __name__ == '__main__':
  51. run()