10

As I am logging my entire models and params into mlflow I thought it will be a good idea to have it protected under a user name and password.

I use the following code to run the mlflow server

mlflow server --host 0.0.0.0 --port 11111 works perfect,in mybrowser i type myip:11111 and i see everything (which eventually is the problem)

If I understood the documentation and the following https://groups.google.com/forum/#!topic/mlflow-users/E9QW4HdS8a8 link here correct, I should use nginx to create the authentication.

I installed nginx open sourcre and apache2-utils

created sudo htpasswd -c /etc/apache2/.htpasswd user1 user and passwords.

I edited my /etc/nginx/nginx.conf to the following:

server {
        listen 80;
        listen 443 ssl;

        server_name my_ip;
        root NOT_SURE_WHICH_PATH_TO_PUT_HERE, THE VENV?;
        location / {
            proxy_pass                      my_ip:11111/;
            auth_basic                      "Restricted Content";
            auth_basic_user_file /home/path to the password file/.htpasswd;
        }
    }

but no authentication appears.

if I change the conf to listen to listen 11111 I get an error that the port is already in use ( of course, by the mlflow server....)

my wish is to have a authentication window before anyone can enter by the mlflow with a browser.

would be happy to hear any suggestions.

4

4 回答 4

6

这里的问题是两者mlflownginx试图在同一个端口上运行......

  1. 首先让我们处理nginx:

    1.1 在 /etc/nginx/sites-enable 中新建一个文件sudo nano mlflow并删除现有的默认值。

    1.2 在 mlflow 文件中:

server {
    listen YOUR_PORT;
    server_name YOUR_IP_OR_DOMAIN;
    auth_basic           “Administrator’s Area”;
    auth_basic_user_file /etc/apache2/.htpasswd; #read the link below how to set username and pwd in nginx

    location / {
        proxy_pass http://localhost:8000;
        include /etc/nginx/proxy_params;
        proxy_redirect off;
    }
}

1.3. 重启 nginxsudo systemctl restart nginx

  1. 在您的服务器上运行 mlflow mlflow server --host localhost --port 8000

现在,如果您尝试在浏览器中访问 YOUR_IP_OR_DOMAIN:YOUR_PORT ,应该会出现一个身份验证弹出窗口,输入您的主机并通过,现在您进入 mlflow

  1. 现在有 2 个选项可以告诉 mlflow 服务器:

    3.1 设置用户名和密码为环境变量 export MLFLOW_TRACKING_USERNAME=user export MLFLOW_TRACKING_PASSWORD=pwd

    3.2 在你/venv/lib/python3.6/site-packages/mlflowpackages/mlflow/tracking/_tracking_service/utils.py的函数中编辑

def _get_rest_store(store_uri, **_):
    def get_default_host_creds():
        return rest_utils.MlflowHostCreds(
            host=store_uri,
            username=replace with nginx user
            password=replace with nginx pwd
            token=os.environ.get(_TRACKING_TOKEN_ENV_VAR),
            ignore_tls_verification=os.environ.get(_TRACKING_INSECURE_TLS_ENV_VAR) == 'true',
        )

在您使用 mlflow 的 .py 文件中:

import mlflow
remote_server_uri = "YOUR_IP_OR_DOMAIN:YOUR_PORT" # set to your server URI
mlflow.set_tracking_uri(remote_server_uri)
mlflow.set_experiment("/my-experiment")
with mlflow.start_run():
    mlflow.log_param("a", 1)
    mlflow.log_metric("b", 2)

nginx 身份验证文档的链接https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/

于 2019-12-13T16:37:32.617 回答
4

如果您只想安装带有一些基本身份验证的 MLFlow,您可以使用mlflow-easyauth来获得一个集成了 HTTP 基本身份验证(用户名/密码)设置的 Docker 容器。它在引擎盖下使用 Nginx。身份验证详细信息是使用环境变量配置的。

免责声明:我是该项目的维护者

于 2020-08-06T12:57:30.487 回答
0

为了让您使用 nginx 为 mlflow 跟踪服务器设置身份验证,您基本上需要执行以下操作;

  1. 应该是 nginx/nginx plus (但 nginx 将用于此目的)
  2. 您需要打开两个端口,一个用于跟踪服务器以默认运行(在您的情况下为 11111)另一个用于运行带密码保护的气流(例如 8080,它可以是任何必须由防火墙打开的端口)
  3. /etc/nginx使用命令在目录下使用htpasswd实用程序创建一个auth文件,sudo htpasswd -c /etc/nginx/.htpasswd user_name并在提示时输入密码。
  4. 确保您已将此文件的权限更改为 644,否则您的代理重定向将起作用,但您在输入用户名和密码后可能会遇到 500 错误,这是因为服务无法访问 auth 文件。

现在,您可以去sudo nano /etc/nginx/sites-enabled/default文件注释文件中的所有内容并创建一个单独的服务器块并放下以下配置,您想知道为什么需要单独编辑此文件?那么我强烈建议您查看此讨论启用站点和可用站点之间的区别?进行更改后,您的配置文件通常如下所示

server {
    listen 8080;

    location / {
        proxy_pass http://localhost:11111;

        auth_basic           "Administrator’s Area";
        auth_basic_user_file /etc/nginx/.htpasswd;

    }
}

完成上述操作后,您可以检查配置诊断,然后您需要重新启动 nginx 服务器

sudo nginx -t
sudo service nginx restart

现在,您可以检查您的新端口,即 8080,希望它可以工作。

您还必须为 mlflow 设置环境变量,以便在运行训练作业时使用更新的凭据。在您的代码中添加以下行,

import os

# Set username and password when authentication was added
os.environ['MLFLOW_TRACKING_USERNAME'] = <MLFLOW_TRACKING_USERNAME>
os.environ['MLFLOW_TRACKING_PASSWORD'] = <MLFLOW_TRACKING_PASSWORD> 

附加提示:

  1. 您还可以在配置中添加 ssl ,以便您可以使用https协议而不是http,假设您有证书。如果您没有,您可以创建自签名的或使用一些免费工具,如certibot等。

然后您的配置将类似这样,您必须在端口侦听部分下添加此证书;

listen 8080 ssl;

#server_name YOUR_IP_OR_DOMAIN;
ssl_certificate /etc/nginx/certificate/certificate.crt;
ssl_certificate_key /etc/nginx/certificate/certificate.key;
  1. 有时,尽管您按照程序完成了所有操作,但身份验证可能无法反映。在这种情况下,您需要将身份验证文件的所有者从 root 更改为“www-data 用户”。

希望这篇文章在第一次设置和调试时有所帮助。

谢谢你。

于 2021-05-14T12:00:32.187 回答
-1

我认为您在端口 80 进行身份验证后转发到 11111。所以,您可以my_ip:80在浏览器中尝试

于 2019-12-03T08:44:12.753 回答