使用 nginx 运行部署 cherrypy 时出错
error when runing deploying cherrypy with nginx
我在 flask 中创建了一个应用程序并使用 cherrypy 部署了它
def run_server(app):
# Enable WSGI access logging via Paste
app_logged = TransLogger(app)
app.config['JSON_AS_ASCII'] = False
# Mount the WSGI callable object (app) on the root directory
cherrypy.tree.graft(app_logged, '/')
# Set the configuration of the web server
cherrypy.config.update({
'engine.autoreload.on': True,
'log.screen': True,
'server.socket_port': 5050,
'server.socket_host': '0.0.0.0'
})
# Start the CherryPy WSGI web server
cherrypy.engine.start()
cherrypy.engine.block()
if __name__ == "__main__":
# Init spark context and load libraries
sc = init_spark_context()
app = create_app(sc)
# start web server
run_server(app)
我通过添加此代码使用 nginx 锁定了端口 5050
server {
listen 5050;
listen [::]:5050;
server_name _;
root /var/www/html;
location / {
try_files $uri $uri/ =404;
}
}
到/etc/nginx/sites-available/default
我在 运行 cherrypy(或 spark-submit)
时遇到了这个错误
port 5050 is not free
nginx 和 cherrypy (Python) 是独立的 HTTP 服务器,因此它们各自需要自己的端口。您看到 port 5050 is not free
错误是因为这些进程正在争夺同一个进程。 (在这种情况下,它看起来像 nginx 进程首先启动,所以它 "beat" 恰到好处)。这是相关配置:
cherrypy
cherrypy.config.update({
'engine.autoreload.on': True,
'log.screen': True,
'server.socket_port': 5050, # <-- port 5050
'server.socket_host': '0.0.0.0'
})
nginx
server {
listen 5050; # <-- port 5050
在你的 nginx 配置中试试这样的东西:
server {
listen 8080;
server_name localhost;
upstream my_cherrypy_svc {
server localhost:5050;
}
location /foo {
proxy_pass http://my_cherrypy_svc;
proxy_redirect default;
}
}
这会在端口 8080 上创建一个 nginx 服务器 运行,代理 /foo
对端口 5050 上的 cherrypy 服务器 运行 的请求。
换句话说,对于在您的 Flask 应用程序中实现的假设端点 /bar
,您应该会看到这两个调用的相同结果:
curl localhost:5050/bar # hits the cherrypy server directly, bypassing nginx
curl localhost:8080/foo/bar # hits nginx, which matches on the `foo` prefix and forwards the request to cherrypy
这有点做作,但希望能说明主要问题:nginx 和 cherrypy 是独立的服务器,因此它们每个都需要一个自己的端口。 (如果您同时拥有多个 cherrypy 服务器 运行,此模式特别方便,因为所有互联网流量都可以定向到 nginx,然后 nginx 可以将调用分派到适当的 cherrypy 服务器。)
我在 flask 中创建了一个应用程序并使用 cherrypy 部署了它
def run_server(app):
# Enable WSGI access logging via Paste
app_logged = TransLogger(app)
app.config['JSON_AS_ASCII'] = False
# Mount the WSGI callable object (app) on the root directory
cherrypy.tree.graft(app_logged, '/')
# Set the configuration of the web server
cherrypy.config.update({
'engine.autoreload.on': True,
'log.screen': True,
'server.socket_port': 5050,
'server.socket_host': '0.0.0.0'
})
# Start the CherryPy WSGI web server
cherrypy.engine.start()
cherrypy.engine.block()
if __name__ == "__main__":
# Init spark context and load libraries
sc = init_spark_context()
app = create_app(sc)
# start web server
run_server(app)
我通过添加此代码使用 nginx 锁定了端口 5050
server {
listen 5050;
listen [::]:5050;
server_name _;
root /var/www/html;
location / {
try_files $uri $uri/ =404;
}
}
到/etc/nginx/sites-available/default
我在 运行 cherrypy(或 spark-submit)
时遇到了这个错误port 5050 is not free
nginx 和 cherrypy (Python) 是独立的 HTTP 服务器,因此它们各自需要自己的端口。您看到 port 5050 is not free
错误是因为这些进程正在争夺同一个进程。 (在这种情况下,它看起来像 nginx 进程首先启动,所以它 "beat" 恰到好处)。这是相关配置:
cherrypy
cherrypy.config.update({
'engine.autoreload.on': True,
'log.screen': True,
'server.socket_port': 5050, # <-- port 5050
'server.socket_host': '0.0.0.0'
})
nginx
server {
listen 5050; # <-- port 5050
在你的 nginx 配置中试试这样的东西:
server {
listen 8080;
server_name localhost;
upstream my_cherrypy_svc {
server localhost:5050;
}
location /foo {
proxy_pass http://my_cherrypy_svc;
proxy_redirect default;
}
}
这会在端口 8080 上创建一个 nginx 服务器 运行,代理 /foo
对端口 5050 上的 cherrypy 服务器 运行 的请求。
换句话说,对于在您的 Flask 应用程序中实现的假设端点 /bar
,您应该会看到这两个调用的相同结果:
curl localhost:5050/bar # hits the cherrypy server directly, bypassing nginx
curl localhost:8080/foo/bar # hits nginx, which matches on the `foo` prefix and forwards the request to cherrypy
这有点做作,但希望能说明主要问题:nginx 和 cherrypy 是独立的服务器,因此它们每个都需要一个自己的端口。 (如果您同时拥有多个 cherrypy 服务器 运行,此模式特别方便,因为所有互联网流量都可以定向到 nginx,然后 nginx 可以将调用分派到适当的 cherrypy 服务器。)