Nginx同一域名下代理airflow与flower

airflow的webserver默认监听为8080端口,若使用Celery执行任务,一般也会开启flower来监控Celery任务,而flower默认监听端口为5555。这样的话每次还得输入端口号来访问这两个服务,很不方便。我就想能不能将两个服务使用nginx代理到同一端口(80或者的433),而通过路由/airflow/flower分别来访问。

在文档里查了一下,果不其然airflow的作者也想到了这个问题:https://airflow.apache.org/integration.html

以我的域名为例www.xubiaosunny.online

修改配置文件airflow.cfg

base_url = https://www.xubiaosunny.online/airflow

flower_url_prefix = /flower

Nginx添加配置

location /airflow/ {
    proxy_pass http://localhost:8080;
    proxy_set_header Host $host;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

location /flower/ {
    rewrite ^/myorg/flower/(.*)$ /$1 break;  # remove prefix from http header
    proxy_pass http://localhost:5555;
    proxy_set_header Host $host;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

这样配置完,就可以通过https://www.xubiaosunny.online/airflow/https://www.xubiaosunny.online/airflow/来访问airflow和flower了。

默认airflow是监听广播地址0.0.0.0,我们现在还可以通过8080和5555端口来访问。可以改为127.0.0.1来限制。修改配置文件

web_server_host = localhost

flower_host = localhost

到这其实我觉得还有一个问题,就是如果使用airflow flower来启动flower的话默认没有认真,不太安全。而且airflow配置文件内也没有这个配置。flower可以使用自己的命令启动

文档地址: https://flower.readthedocs.io/en/latest/auth.html

celery flower --url_prefix=/flower --basic_auth=user1:password1,user2:password2