Не работает ajax nginx

Nginx + Ajax + Post = проблемы

На проекте необходимо передавать с десяток файлов, с помощью Ajax.
Установлена виртуальная машина BitrixVM, на которой крутиться проект.
Nginx не дает файлы передавать методом Post (Ajax), вываливается ошибка: «405 Not Allowed».
Nginx раздает статический контент. Суть проблемы в том, что nginx при раздаче статического контента не поддерживает запросы POST.

Пробывал сделать проброс на апач таким способом:

Существует несколько возможных причин такого поведения. Некоторые из них зависят от версии Nginx.

Если интересует именно причина проблемы, то было бы неплохо предоставить некоторую дополнительную информацию:

  • версию Nginx (nginx -v);
  • конфигурацию веб-сервера (файлы с расширением .conf из /etc/nginx);
  • заголовки HTTP запроса и ответа (можно получить с помощью инструментов разработчика в Chrome или Firefox).

Если же требуется только решение, то достаточно доработать второй вариант — заменить бессмысленную в данном контексте директиву root на proxy_pass к соответствующему бекенду.

Да, меня интересует причина проблемы, чтобы в последствии больше не наступать на те же грабли.

Предоставляю доп. информацию:
nginx version: nginx/1.4.3

/ect/nginx/nginx.conf

/*

events <
use epoll;
worker_connections 10240;
>

include /etc/nginx/mime.types;
default_type application/force-download;
server_names_hash_bucket_size 128;

# Description of supported access log formats
log_format main’$remote_addr — $remote_user [$time_local — upstream_response_time] $status «$request» $body_bytes_sent «$http_referer» «$http_user_agent» «$http_x_forwarded_for»‘;

log_format common ‘$remote_addr — — [$time_local — $upstream_response_time] «$request» $status $bytes_sent «$http_referer» «$http_user_agent» $msec’;

log_format debug ‘$upstream_response_time,»$time_local»,»$remote_addr»,»$request»,$status,$body_bytes_sent’;

# Disable request logging in nginx by default
#access_log /var/log/nginx/access.log common;
access_logoff;

# Parameters for back-end request proxy
proxy_connect_timeout300;
proxy_send_timeout300;
proxy_read_timeout300;
proxy_buffer_size64k;
proxy_buffers8 256k;
proxy_busy_buffers_size256k;
proxy_temp_file_write_size10m;

# Assign default error handlers
error_page 500 502 503 504 /500.html;
error_page 404 = /404.html;

# Content compression parameters
gzipon;
gzip_proxiedany;
gzip_staticon;
gzip_http_version1.0;
gzip_typesapplication/x-javascript text/css;

add_header «X-Content-Type-Options» «nosniff»;

# Set nginx-push-stream-module common parameters
include bx/conf/im_settings.conf;

# Set default website
include bx/site_enabled/*.conf;

# Set additional websites
include bx/site_ext_enabled/*.conf;
>

user bitrix;worker_processes 8;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
worker_rlimit_nofile 10240;

/etc/nginx/bx/conf/bitrix.conf

# Assign error handler
include bx/conf/errors.conf;

# Include im subscrider handlers
include bx/conf/im_subscrider.conf;

# Add / to request for dav services
location

^(/extranet/docs|/docs|/workgroups|/company/profile|/bitrix/tools|/company/personal/user|/extranet/contacts/personal|/extranet/workgroups|/mobile/webdav) <
include bx/conf/security.conf;

# dav service processing
location

^(/extranet/docs|/docs|/workgroups|/company/profile|/bitrix/tools|/company/personal/user|/extranet/contacts/personal|/extranet/workgroups|/mobile/webdav).*/$ <
include bx/conf/security.conf;
proxy_pass $proxyserver;
>

# HTML cache location for calls without kernel
location

^(/bitrix/html_pages) <
index index@.html;
include bx/conf/security.conf;

if (!-f $request_filename) <
rewrite ^/bitrix/html_pages(.*)/index@.html$ $1/ break;
rewrite ^/bitrix/html_pages(.*)/index@(.*)\.html$ $1/?$2 break;
rewrite ^/bitrix/html_pages(.*)@.html$ $1.php break;
rewrite ^/bitrix/html_pages(.*)@(.*)\.html$ $1.php?$2 break;
proxy_pass $proxyserver;
>
>

# php file processing
location

\.php$ <
include bx/conf/security.conf;
if ($request_method = POST ) <
break;
proxy_pass $proxyserver;
>

# If session is not set and HTML cache is enabled, try cached file first
set $usecache «»;
if ($http_cookie !

# Dynamic pages
location

/$ <
include bx/conf/security.conf;
if ($request_method = POST ) <
break;
proxy_pass $proxyserver;
>

# If session is not set and HTML cache is enabled, try cached file first
set $usecache «»;
if ($http_cookie !

# Deny cache access to anyone except for merged CSS files and JS files
location ^

# Excange and Outlook
location

# Deny external access to critical areas
location

# Static content
location ^

# Use nginx to return static content from s3 cloud storage
location ^

^/upload/bx_cloud_upload/(http[s]?)\.([^/:]+)\.(s3|s3-us-west-1|s3-eu-west-1|s3-ap-southeast-1|s3-ap-northeast-1)\.amazonaws\.com/(.+)$ <
internal;
resolver 8.8.8.8;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Server $host;
#proxy_max_temp_file_size 0;
proxy_pass $1://$2.$3.amazonaws.com/$4;
>
location

# Apache server status page
location ^

# Nginx server status page
location ^

/nginx-status <
stub_status on;
allow 127.0.0.0/24;
deny all;
>

# Main location
location / <
expires 15d;
include bx/conf/security.conf;
# dav processing
if ($request_method

# Error page for static content
if ($request_filename

* \.(css|js|gif|png|jpg|jpeg|ico)$) <
error_page 404 /404.html;
break;
>
>

# Bitrix setup script
location ^

^(/bitrixsetup\.php)$

Заголовки HTTP запроса и ответа

Remote Address:192.168.7.238:80
Request URL: http://192.168.7.238/upload.php
Request Method:POST
Status Code:405 Not Allowed
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,lzma
Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Content-Length:667516
Content-Type:multipart/form-data; boundary=—-WebKitFormBoundaryG9FIzWmdQAls1WVU
Cookie:authautologin=R7ebDMB9t2SJ4PJSLeozpy0YsyyS1OCL; __utma=121056456.722613466.1412690277.1415281578.1415284425.55; __utmz=121056456.1412690277.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Host:192.168.7.238
Origin: http://192.168.7.238
Referer: http://192.168.7.238/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36 OPR/25.0.1614.68
X-Requested-With:XMLHttpRequest
Request Payload
——WebKitFormBoundaryG9FIzWmdQAls1WVU
Content-Disposition: form-data; name=»myfile[]»; filename=»(1).png»
Content-Type: image/png

——WebKitFormBoundaryG9FIzWmdQAls1WVU
Content-Disposition: form-data; name=»myfile[]»; filename=»(2).png»
Content-Type: image/png

Источник

При включении протокола spdy перестают работать Ajax запросы

При включении протокола spdy перестают работать Ajax запросы.
НА первом сервере стоит Nginx, а на другом сервере billmgr, если на nginx не включать протокол spdy:

Ajax запросы не работают, например нельзя поменять пароль себе.
Пробовал все браузеры везде одинаково.
Это очень проблемно для меня т.к. у меня nginx стоит первый и пропускает через себя все домены, а протокол spdy включается для всех.

Проблему подтверждаю. Проверял еще на старых версиях nginx, как только там появилась поддержка spdy. Сейчас ничего не изменилось. Если включить spdy через перестают работать некоторые запросы к биллингу. Например, «настройки».

Сделайте отдельный вирт.хост в nginx без поддержки spdy и пропускайте через него запросы к биллингу. Я сомневаюсь, что какое-либо другое решение смогут предложить на текущий момент разработчики.

Проблема в том что если я включу SPDY для одного виртуального хоста, то эта настройка влияет на остальные. Поэтому некатит.

spdy описывается на уровне блока server, у вас помимо биллинга там что-то еще живет? я так понимаю, остальные виртуальные хосты, это отдельные блоки server

т.е. у вас вполне спокойно будет работать конструкция

Библиотека которую мы используем для обработки http запросов не поддерживает spdy.
Сменить ее на что то другое в наши ближайшие планы не входит, т.к. пока что особо не на что.
Поэтому так или иначе вам нужно решать вопрос с отключение данного протокола для работы с нашими продуктами.

Протокол HTTP/2 уже вышел (почти, google и не только уже работают на нем) в 5 версии это будет учтено и SPDY?

Нет, мы пока не планируем поддерживать новые модные протоколы, особенно HTTP2 который прошел пока только неформальное одобрение и пройдет еще достаточно много времени пока он начнет повсеместно использоваться. Мы не стремимся быть пионерами в данном вопросе и первыми ловить все грабли, тем более что цель пока не очевидна.
Что касается SPDY то его можно уже считать мертвым, все что на нем хотели откатать откатали и на основе этого родили HTTP2, в браузерах он тоже как то пока не особо распространился.

Т.е. из ваших слов поддержку SPDY и HTTP/2 поддержки не будет вообще.
Спасибо за ответ. 🙁

В ближайшем будущем точно нет.

Источник

LiveStreet CMS

Бесплатные расширения из каталога

Вопросы

Прямой эфир

lifecom 21 сентября 2021, 21:53

cshome 21 сентября 2021, 13:08

rebrov 8 июля 2021, 16:28

lifecom 24 июня 2021, 11:01

Maxit 8 мая 2021, 23:16

Maxit 6 мая 2021, 21:44

sersar 5 апреля 2021, 18:22

lifecom 27 февраля 2021, 03:26

iVee 16 февраля 2021, 13:07

Doom74 5 февраля 2021, 09:03

Работа!

Блоги

  • Блог разработки LiveStreet137.33
  • Сайты на LiveStreet121.49
  • Вопросы83.57
  • Дополнительные модули и доработки для LiveStreet73.21
  • Техническая документация LiveStreet68.62
  • Tips & tricks60.64
  • Биржа заказов на разработку и поддержку за деньги56.28
  • Предложения и пожелания46.04
  • Шаблоны для LiveStreet38.75
  • Решения проблем28.89

работа php-fpm и JQuery на LS 0.4.2 (проблема)

Здравствуйте, прошу подсказки куда копать?
При переходе с Apache+nginx на php-fpm+nginx перестали работать скрипты в моих разработанных плагинах,
в местах выводимой информации пишет Hacking attemp! ошибок по работе скриптов нету, просто неработают ajax функции плагина.

кусок фрагмента кода.

мои подозрения на то, что на сервере не проходит авторизация сесси пользователией для этих методов работы с jQuery

«+data+» это как раз данные которые передает туда где появлется Hacking attemp!

Источник

Node.js+ajax+долгий sql-запрос. Почему данные не доходят до клиента?

Приложение — генератор отчетов, по данным, полученным из MS SQL SERVER.
На клиенте создается ajax запрос к серверу. Сервер запускает sql-запрос к скулю, получает данные, сериализует в json и отправляет клиенту. Клиент на основе данных ответа генерит таблицу и выводит на страницу.
Столкнулся с тем, что слишком долго выполняется sql-запрос (около 4х минут).
Eсли я захожу на сайт через nginx, то через 2 минуты после отправки ajax’а, получаю алерт «Ошибка error: Bad Gateway», а если захожу на сайт через localhost: port, т.е. минуя nginx, то получаю алерт «Ошибка error: error».
одновременно с этим в консоль выводится запись:
GET /result?IP=10.10.10.7&CODE=12&START=02.12.2013&END= 02.12.2014 200 120618ms
статус 200.
время выполнения хоть и указано 2 минуты +- пара секунд, но реально sql-запрос еще продолжает работать. Это становится ясно потому что еще через пару минут в туже консоль ниже выводятся записи
console.log(«SerializeToJSON»);
и
console.log(«SendClient»);
из соответствующих функций. Но к этому времени, возникает ощущение, что обратная связь с клиентом через объект res уже потеряна и в результате res.end(jsonData); уходит в никуда.
у кого есть какие мысли на этот счет? не знаю куда еще копнуть и что проверить?
Если уменьшить время время выполнения sql-запроса и соответственно объем полученных данных, путем подбора аргументов запроса, то все работает.
Для открытия коннекта и выполнения запроса использую модуль odbc
в документации ничего про таймауты на выполнения запроса не сказано.
Пробовал задать таймаут в строке коннекта вот так:
var Connect = «Driver=;Server=» + ip + «;Database=MyDB;UID=sa;PWD=password;command timeout=600000;»;
не помогло.
это код серверной части, обработчик ajax’а:

а вот код ajax ф-и на клиенте:

Сервер создан на основе модуля Express:

Может это node (или кто-то другой) закрывает соединение с клиентом через 2 минуты? Может какие-то таймауты в ноде надо указать?

  • Вопрос задан более трёх лет назад
  • 3551 просмотр

>может сериализация данных из mysql в сумме с запросом превышает таймаут.
только выполнение одного sql-запроса уже превышает видимо таймаут.
вопрос: таймаут чего превышается? как в chrome задать таймаут ожидания ответа сервера? да и возможно ли это вообще? в заголовках connection: keep-alive, если что.

UPD:
Что-то не могу ответить на коментарии, поэтому отредактирую здесь:
В ответ на коментарии ak-o:

ak-o: nginx используется только для проксирования. я может не совсем понятно написал. но sql-запрос не выполнился за 2 минуты. Вот как все происходит! Клиент послал ajax запрос web-серверу, web-сервер запустил sql-запрос к базе данных, который выполняется около 4 минут. По истечению 2 минут с момента отправки ajax-запроса от клиента web-серверу, я получаю ошибку, но на самом деле работа web-сервера все еще продолжается, sql-запрос продолжает выполняться и через какое-то время отрабатывает, возвращая набор данных из базы, после этого запускается сериализация этих данных и отправка сериализованных данных клиенту, но на самом деле данные уходят в никуда! Потому что похоже связь между web-сервером и браузером уже разорвана (ведь была же ошибка). Ошибку генерит обработчик error в ajax запросе. Вопрос почему и кто рвет соединение меня и беспокоит. )) Спасибо за советы, попробую. По-любму кто-то уже сталкивался с подобной проблемой, но вот нагуглить по её решению ничего не удалось. (

UPD2:
Попробовал и без sql-запроса. Поставил setTimeout на 3 минуты. Картина та же. Через 2 минуты ошибка, еще через минуту отправка ответа в никуда.

К сожалению мне сложно вам подсказать, к слову даже не понимаю зачем нужен nginx когда nodejs и есть http-server (Ну может у вас одно там, другое там,в целом это никак не поможет решить вашу проблему).
Если провести обычный тест, то у меня все отработало на ура.
Скрипт Ajax’ом передает get запрос ?test=test , и если он есть, висит 10 минут.

В случае sleep(2) и timeout: 5000 = success
В случае sleep(1*60) и timeout: 5000 = error (Aborted)
В случае sleep(1*60*10) и timeout: 600000 = error(Aborted)
(Не проверял, но думаю это из за того что на клиенте таймер пошел раньше чем начался выполнятся скрипт, и поставив мы скажем 700000 будет success. На 600000 проверил разок firefox\chrome);
Т.е как мне кажется, это доказывает, что timeout в ajax работает правильно, и умирает , если не получил ответ.
Вы пишите, что запрос выполнился за 2 минуты, но сериализация продолжилась.
Вероятно ответ был отправлен до окончания сериализации ?
Кто начал обрабатывать запрос? nginx или nodejs?
С nginx знаком плохо, а вот у Apache есть лимит на выполнение скрипта, собственно поэтому я и использовал ini_set(«max_execution_time», «99999»); set_time_limit(99999);
В общем, могу посоветовать только «работу над ошибками».
Используйте простые примеры (не выполняйте sql и т.д. Отправьте запрос и «зависните» на N время после отдавайте ответ success) Следовательно проверяйте, какие события срабатывают на клиенте в каких случаях и что возвращает ответ сервера при успехе.
Надеюсь сможете найти проблему, удачи!

Источник

Читайте также:  Ноутбук acer не работает видеокарта
Оцените статью