如何使用uWSGI白名单命令及配置uwsgi.ini实现白名单功能
Hey there! Let's break down how to get uWSGI's whitelist working correctly, since it's easy to mix up what it actually controls. First, let's fix a tiny typo in your config that might cause other issues, then clarify what the whitelist option does and how to use it properly.
首先,纠正你配置里的小错误
你的static-map路径少了一个斜杠,正确写法应该是:
static-map = /static=/usr/local/myproject/static
这个不影响白名单,但能修复静态文件的访问问题,如果之前没注意到的话。
关键:搞清楚whitelist的作用范围
这是最容易混淆的点!uWSGI的whitelist选项只限制uWSGI内部控制端口的访问(比如你配置的stats = 127.0.0.1:5566端口),完全不影响你的主HTTP应用端口(http = :80)。
如果你本来是想阻止外部访问80端口的应用,那whitelist根本起不到作用——这类限制需要靠前端Web服务器(比如Nginx)或者Python应用内部的IP过滤来实现。
验证你的当前白名单是否生效(针对stats端口)
你当前的whitelist = 127.0.0.1配置是正确的,它会把stats端口的访问限制在本地。可以这样测试:
- 在服务器本地执行
uwsgi --connect-and-read 127.0.0.1:5566,应该能看到JSON格式的stats数据。 - 从其他机器尝试访问这个5566端口(比如用
curl),连接会被阻断或者超时。
正确配置白名单的多种场景
如果需要调整控制端口的白名单,这里有几种常见用法:
- 单个IP:你当前的配置就没问题:
whitelist = 127.0.0.1 - 多个IP:用空格分隔:
whitelist = 127.0.0.1 192.168.1.100 - 整个网段:使用CIDR格式:
whitelist = 192.168.1.0/24 - 所有控制端口:白名单规则会自动应用到你配置的所有内部控制端口(stats、admin、rpc等)。
如果需要限制你的HTTP应用(80端口)的访问
既然whitelist管不到主应用端口,推荐用下面两种方法:
方法1:用Nginx做反向代理(推荐)
让Nginx代理请求到uWSGI,然后在Nginx里添加IP限制:
server { listen 80; server_name your-domain.com; location / { # 只允许这些IP/网段访问 allow 127.0.0.1; allow 192.168.1.0/24; deny all; uwsgi_pass unix:/path/to/your/uwsgi.sock; # 也可以用TCP方式 include uwsgi_params; } # 让Nginx直接处理静态文件(性能更好) location /static/ { root /usr/local/myproject; } }
方法2:在Python应用里添加IP过滤
如果你用的是Django、Flask这类框架,可以添加中间件来拦截未授权的IP。比如Django的中间件:
# myproject/middleware.py from django.http import HttpResponseForbidden class IPWhitelistMiddleware: def __init__(self, get_response): self.get_response = get_response # 允许访问的IP列表 self.allowed_ips = {"127.0.0.1", "192.168.1.100"} def __call__(self, request): client_ip = request.META.get("REMOTE_ADDR") if client_ip not in self.allowed_ips: return HttpResponseForbidden("访问被拒绝:你的IP不在白名单内。") response = self.get_response(request) return response
然后在settings.py里注册这个中间件:
MIDDLEWARE = [ # ... 其他中间件 ... "myproject.middleware.IPWhitelistMiddleware", ]
总结
- 你当前的
whitelist配置对于限制stats端口访问是完全正确的。 - 如果是想限制主应用的访问,需要用Nginx或者应用级中间件来实现。
内容的提问来源于stack exchange,提问作者Greta James

