使用 Neutron API 的 WSGI¶
本文档是使用 WSGI 部署 Neutron 的指南。有两种方法可以使用 WSGI 部署:uwsgi 和 Apache mod_wsgi。
请注意,如果您打算使用 uwsgi 模式,您应该安装 mode_proxy_uwsgi 模块。例如,在基于 deb 的系统上
# sudo apt-get install libapache2-mod-proxy-uwsgi
# sudo a2enmod proxy
# sudo a2enmod proxy_uwsgi
WSGI 应用程序¶
函数 neutron.server.get_application 将设置一个 WSGI 应用程序,以便在 uwsgi 和 mod_wsgi 之后运行。
uwsgi 后面的 Neutron API¶
创建一个 /etc/neutron/neutron-api-uwsgi.ini 文件,内容如下
[uwsgi]
chmod-socket = 666
socket = /var/run/uwsgi/neutron-api.socket
lazy-apps = true
add-header = Connection: close
buffer-size = 65535
hook-master-start = unix_signal:15 gracefully_kill_them_all
thunder-lock = true
plugins = python
enable-threads = true
worker-reload-mercy = 90
exit-on-reload = false
die-on-term = true
master = true
processes = 2
wsgi-file = <path-to-neutron-bin-dir>/neutron-api
start-time = %t
启动 neutron-api
# uwsgi --procname-prefix neutron-api --ini /etc/neutron/neutron-api-uwsgi.ini
mod_wsgi 后面的 Neutron API¶
创建 /etc/apache2/neutron.conf 文件,内容如下
Listen 9696
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" %D(us)" neutron_combined
<Directory /usr/local/bin>
Require all granted
</Directory>
<VirtualHost *:9696>
WSGIDaemonProcess neutron-server processes=1 threads=1 user=stack display-name=%{GROUP}
WSGIProcessGroup neutron-server
WSGIScriptAlias / <path-to-neutron-bin-dir>/neutron-api
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
ErrorLogFormat "%M"
ErrorLog /var/log/neutron/neutron.log
CustomLog /var/log/neutron/neutron_access.log neutron_combined
</VirtualHost>
Alias /networking <path-to-neutron-bin-dir>/neutron-api
<Location /networking>
SetHandler wsgi-script
Options +ExecCGI
WSGIProcessGroup neutron-server
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
</Location>
WSGISocketPrefix /var/run/apache2
对于基于 deb 的系统,将文件复制或符号链接到 /etc/apache2/sites-available。然后启用 neutron 站点
# a2ensite neutron
# systemctl reload apache2.service
对于基于 rpm 的系统,将文件复制到 /etc/httpd/conf.d。然后启用 neutron 站点
# systemctl reload httpd.service
启动 Neutron RPC 服务器¶
当 Neutron API 由 Web 服务器(如 Apache2)提供时,很难启动一个 rpc 监听线程。因此,启动 Neutron RPC 服务器进程来完成这项工作
# /usr/bin/neutron-rpc-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini
Neutron 工作进程¶
Neutron 将尝试为处理 API 和 RPC 请求生成多个子进程。API 工作进程的数量设置为 CPU 核心数,进一步受可用内存限制,RPC 工作进程的数量设置为该数量的一半。
强烈建议所有部署者通过 api_workers 和 rpc_workers 配置参数自行设置这些值。
对于负载较高但对象数量相对较少的云,较小的 api_workers 值将提供比许多值更好的性能(大约在 4-8 左右)。对于负载较高且对象种类繁多的云,越多越好。在稳定状态下,将 neutron-server 的内存预算设置为大约 2GB。
对于 rpc_workers,需要有足够的数量来跟上来自各种 neutron agent 的传入事件。如果数量太少,则 agent heartbeat 可能会延迟到达,hypervisors 上的 nova vif 绑定可能会超时,或者 agent 日志中可能会出现 rpc 消息超时异常(例如,“broken pipe”错误)。
还有 rpc_state_report_workers 选项,它确定了专门用于处理来自各种 agent 的状态报告的 RPC 工作进程的数量。可以增加此值以解决 agent heartbeat 延迟频繁的问题。
注意
如果使用 OVN ML2 插件且没有其他 agent,则 neutron 不需要任何 worker 来处理 RPC 消息。将 rpc_workers 和 rpc_state_report_workers 都设置为 0,以禁用 RPC worker。
注意
ML2/OVN 使用 [uwsgi]start-time = %t 参数在初始化过程中创建 OVN 哈希环寄存器。此值由 uWSGi 进程与启动时间一起填充。有关更多信息,请查看 配置 uWSGI <https://uwsgi-docs.readthedocs.io/en/2025.2/Configuration.html>_.