wsgi.py 2.0 KB

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