好的,这是我的设置。我在 Heroku 上使用 scrapy-heroku 包https://github.com/dmclain/scrapy-heroku运行一个 scrapyd 守护进程。
我遇到了数据库连接不足的问题。我决定尝试使用 pgbouncer 汇集数据库连接。我正在使用这个构建包:https ://github.com/heroku/heroku-buildpack-pgbouncer
我的 procfile 是: web: scrapyd
我将其更改为: web: bin/start-pgbouncer-stunnel scrapyd
buildpack 应该在初始化时重写您的 DATABASE_URL,以便运行的任何子进程都可以正常使用 DATABASE_URL 但现在将连接到 pgbouncer 而不是直接连接到数据库。
在 scrapy 中,我使用 adbapi 为每个蜘蛛创建一个池,如下所示:
def from_settings(cls, settings):
dbargs = dict(
host=settings['MYSQL_HOST'],
database=settings['MYSQL_DBNAME'],
user=settings['MYSQL_USER'],
password=settings['MYSQL_PASSWD'],
#charset='utf8',
#use_unicode=True,
)
dbpool = adbapi.ConnectionPool('psycopg2', cp_max=2, cp_min=1, **dbargs)
return cls(dbpool)
在我的设置中,这就是我获取 DATABASE_URL 信息的方式:
import urlparse
urlparse.uses_netloc.append("postgres")
url = urlparse.urlparse(os.environ["DATABASE_URL"])
MYSQL_HOST = url.hostname
MYSQL_DBNAME = url.path[1:]
MYSQL_USER = url.username
MYSQL_PASSWD = url.password
这在我添加 pgbouncer buildpack 之前工作正常。现在我收到连接错误:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python2.7/site-packages/twisted/internet/defer.py", line 150, in maybeDeferred
result = f(*args, **kw)
File "/app/.heroku/python/lib/python2.7/site-packages/scrapy/xlib/pydispatch/robustapply.py", line 57, in robustApply
return receiver(*arguments, **named)
File "/tmp/etc/etc/etc/middlewares.py", line 92, in spider_opened
File "/app/.heroku/python/lib/python2.7/site-packages/psycopg2/__init__.py", line 164, in connect
conn = _connect(dsn, connection_factory=connection_factory, async=async)
OperationalError: could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port 5432?
有谁知道问题可能是什么?