Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nginx/Apache/WSGI/Django-意外引发500个错误(Nginx上为499个)_Django_Apache_Nginx_Mod Wsgi - Fatal编程技术网

Nginx/Apache/WSGI/Django-意外引发500个错误(Nginx上为499个)

Nginx/Apache/WSGI/Django-意外引发500个错误(Nginx上为499个),django,apache,nginx,mod-wsgi,Django,Apache,Nginx,Mod Wsgi,我的Django服务器在网络托管上有问题。对于一些请求(每天从500.000请求大约1000个),我可以在访问日志中看到错误。在nginx日志中,我可以看到代码为“499”的请求,在apache日志中,它们有“500”错误代码 奇怪的是,我在django日志中没有看到任何问题(通常我在接收邮件时除了stacktrace)。你能帮帮我吗,是什么导致了这种奇怪的行为 在收到超过主机内存限制的问题后,我开始调查日志。似乎我的应用程序有一些内存泄漏,因为我可以看到使用的内存正在缓慢上升。所以我尝试通过优

我的Django服务器在网络托管上有问题。对于一些请求(每天从500.000请求大约1000个),我可以在访问日志中看到错误。在nginx日志中,我可以看到代码为“499”的请求,在apache日志中,它们有“500”错误代码

奇怪的是,我在django日志中没有看到任何问题(通常我在接收邮件时除了stacktrace)。你能帮帮我吗,是什么导致了这种奇怪的行为

在收到超过主机内存限制的问题后,我开始调查日志。似乎我的应用程序有一些内存泄漏,因为我可以看到使用的内存正在缓慢上升。所以我尝试通过优化我的wsgi进程、线程和设置最大请求参数来快速修复。在此之后,我将调查内存泄漏的原因

我的基础设施如下:

ServerRoot "/home/quick/webapps/citaty/apache2"

LoadModule authz_core_module modules/mod_authz_core.so
LoadModule dir_module        modules/mod_dir.so
LoadModule env_module        modules/mod_env.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module       modules/mod_mime.so
LoadModule rewrite_module    modules/mod_rewrite.so
LoadModule setenvif_module   modules/mod_setenvif.so
LoadModule wsgi_module       modules/mod_wsgi.so
LoadModule unixd_module      modules/mod_unixd.so

LogFormat "%{X-Forwarded-For}i %l %u %t %{Host}i \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %T %D" combined
CustomLog /home/quick/logs/user/access_citaty.log combined
ErrorLog /home/quick/logs/user/error_citaty.log

Listen 21628
KeepAlive Off
SetEnvIf X-Forwarded-SSL on HTTPS=1
ServerLimit 1
StartServers 1
MaxRequestWorkers 10
MinSpareThreads 1
MaxSpareThreads 5
ThreadsPerChild 10
MaxRequestsPerChild 1000

WSGIRestrictEmbedded On
WSGILazyInitialization On

<VirtualHost *>
    ServerName domain.com

    CustomLog /home/quick/logs/user/access_citaty.log combined
    ErrorLog /home/quick/logs/user/error_citaty.log

    WSGIDaemonProcess citaty processes=5 threads=1 maximum-requests=1000 python-path=/home/quick/webapps/citaty:/home/quick/webapps/citaty/lib/python3.4/site-packages display-name=%{GROUP}
    WSGIProcessGroup citaty
    WSGIScriptAlias / /home/quick/webapps/citaty/apache2/conf/citaty.wsgi

</VirtualHost>

<VirtualHost *>
    ServerName domain2.com

    CustomLog /home/quick/logs/user/access_citaty_laska.log combined
    ErrorLog /home/quick/logs/user/error_citaty_laska.log

    WSGIDaemonProcess citaty_laska processes=1 threads=1 maximum-requests=1000 python-path=/home/quick/webapps/citaty:/home/quick/webapps/citaty/lib/python3.4/site-packages display-name=%{GROUP}
    WSGIProcessGroup citaty_laska
    WSGIScriptAlias / /home/quick/webapps/citaty/apache2/conf/citaty_laska.wsgi
</VirtualHost>
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'file': {
            'level': 'INFO',
            'filters': ['require_debug_false'],
            'class': 'logging.FileHandler',
            'filename': '/home/quick/logs/user/django_citaty.log',
        },
        'file_jobs': {
            'class': 'logging.FileHandler',
            'filename': '/home/quick/logs/user/django_jobs.log',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file', 'mail_admins'],
        },
        'py.warnings': {
            'handlers': ['file'],
        },
        'citaty.sources.crawlers.base': {
            'level': 'INFO',
            'handlers': ['file_jobs', 'console'],
        },

    },
}
  • Nginx-前端服务器(由webpartion操作)
  • Apache/2.4.16,带有mod_wsgi 4.4.13/Python 3.4
  • Django 1.8.12
我的httpd.conf如下所示:

ServerRoot "/home/quick/webapps/citaty/apache2"

LoadModule authz_core_module modules/mod_authz_core.so
LoadModule dir_module        modules/mod_dir.so
LoadModule env_module        modules/mod_env.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module       modules/mod_mime.so
LoadModule rewrite_module    modules/mod_rewrite.so
LoadModule setenvif_module   modules/mod_setenvif.so
LoadModule wsgi_module       modules/mod_wsgi.so
LoadModule unixd_module      modules/mod_unixd.so

LogFormat "%{X-Forwarded-For}i %l %u %t %{Host}i \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %T %D" combined
CustomLog /home/quick/logs/user/access_citaty.log combined
ErrorLog /home/quick/logs/user/error_citaty.log

Listen 21628
KeepAlive Off
SetEnvIf X-Forwarded-SSL on HTTPS=1
ServerLimit 1
StartServers 1
MaxRequestWorkers 10
MinSpareThreads 1
MaxSpareThreads 5
ThreadsPerChild 10
MaxRequestsPerChild 1000

WSGIRestrictEmbedded On
WSGILazyInitialization On

<VirtualHost *>
    ServerName domain.com

    CustomLog /home/quick/logs/user/access_citaty.log combined
    ErrorLog /home/quick/logs/user/error_citaty.log

    WSGIDaemonProcess citaty processes=5 threads=1 maximum-requests=1000 python-path=/home/quick/webapps/citaty:/home/quick/webapps/citaty/lib/python3.4/site-packages display-name=%{GROUP}
    WSGIProcessGroup citaty
    WSGIScriptAlias / /home/quick/webapps/citaty/apache2/conf/citaty.wsgi

</VirtualHost>

<VirtualHost *>
    ServerName domain2.com

    CustomLog /home/quick/logs/user/access_citaty_laska.log combined
    ErrorLog /home/quick/logs/user/error_citaty_laska.log

    WSGIDaemonProcess citaty_laska processes=1 threads=1 maximum-requests=1000 python-path=/home/quick/webapps/citaty:/home/quick/webapps/citaty/lib/python3.4/site-packages display-name=%{GROUP}
    WSGIProcessGroup citaty_laska
    WSGIScriptAlias / /home/quick/webapps/citaty/apache2/conf/citaty_laska.wsgi
</VirtualHost>
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'file': {
            'level': 'INFO',
            'filters': ['require_debug_false'],
            'class': 'logging.FileHandler',
            'filename': '/home/quick/logs/user/django_citaty.log',
        },
        'file_jobs': {
            'class': 'logging.FileHandler',
            'filename': '/home/quick/logs/user/django_jobs.log',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file', 'mail_admins'],
        },
        'py.warnings': {
            'handlers': ['file'],
        },
        'citaty.sources.crawlers.base': {
            'level': 'INFO',
            'handlers': ['file_jobs', 'console'],
        },

    },
}

一个月前我曾经面对过这个问题。nginx会突然抛出499错误代码

当客户端发出请求时,nginx请求uwsgi响应,有时uwsgi响应时间太长,用户认为请求很慢,尝试刷新或再次调用,nginx然后抛出499错误代码

可能的原因:-

  • Uwsgi工作人员消耗相当多的RAM。检查uwsgi配置文件中有多少工人。确保根据系统设置将uwsgi工作进程限制为适当的数目
  • 增加nginx工作者连接。违约率非常低。这会导致连接断开,也会导致500个错误。检查nginx中的连接超时设置。通常是60秒。您可以将时间缩短到25秒左右,以确保nginx准备好接受更多连接
  • 我通过增加服务器RAM修复了这个问题,还添加了负载平衡器以确保一台服务器上没有重负载。 此外,还对uwsgi ini文件和nginx.conf进行了一些更改

    下面是我的uwsgi设置文件-

    [uwsgi]
    project =xxxxxx
    base = /home/ubuntu
    
    chdir = %(base)/xxxxxxx/server
    home = %(base)/envs/api
    module = %(project).wsgi:application
    
    master = true
    cheaper-algo = spare
    cheaper = 2
    cheaper-initial = 3
    cheaper-step = 2
    processes = 20
    workers = 20
    max-requests = 1000
    
    socket = %(base)/xxxx/server/%(project).sock
    chmod-socket = 664
    vacuum = true
    logto=/tmp/uwsgi.log
    
    我的nginx.conf-

    user www-data;
    worker_processes 4;
    pid /run/nginx.pid;
    
    events {
        worker_connections 2048;
        # multi_accept on;
    }
    

    底线-这几乎总是一个内存问题。重新检查代码是否存在内存泄漏。在生产环境中,确保settings.py中的DEBUG=False。使用缓存减少服务器响应时间。

    感谢您的回复。我检查了错误请求的记录响应时间,在这种情况下,似乎不是响应时间慢的问题(错误响应时间不足0.5秒)。但正如你所写,工人的数量可能存在问题。我将尝试增加进程和线程的数量,我将看到。