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