Frontend Для Domino Http/https

NetWood

Lotus Team
17.04.2008
565
96
BIT
174
В общем, дождавшись зафронтендил его на свою Winдузу.
С SSL не заморачивался (он пока не нужен). Конфиг такой:
Код:
#worker_processes  1;
worker_processes auto;
#worker_cpu_affinity auto;
 
events {
	worker_connections  1024;
}
 
http {
	include	   mime.types;
	default_type  application/octet-stream;
 
	log_format main  '$remote_addr - $remote_user [$time_local] $status '
	'"$request" $body_bytes_sent "$http_referer" '
	'"$http_user_agent" "$proxy_add_x_forwarded_for" "$bytes_sent"';
 
	access_log  D:/nginx_logs/access.log main;
	error_log  D:/nginx_logs/error.log;
	#access_log off;
 
	sendfile	   on;
	tcp_nopush	 on;
	tcp_nodelay	on;
	#keepalive_timeout 15;
 
	server {
		listen	   80 default;
		server_name  frontendserver;
 
error_page   500 502 503 504  /50x.html;
 
		# Main location
		location / {
			proxy_pass		 http://127.0.0.1:8080;
			proxy_redirect	 default;
 
	proxy_set_header Accept-Encoding "";
 
			# proxy_redirect off;
 
			proxy_set_header   Host			 $host;
			proxy_set_header   X-Real-IP		$remote_addr;
			proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
 
	#Domino specific https://frostillic.us/f.nsf/posts/AC0BC188EF19959A85257B7B0067E2EA
	#!!!! работает после set conf HTTPEnableConnectorHeaders=1 в домине
	proxy_set_header $WSRA $remote_addr;
	proxy_set_header $WSRH $remote_addr;
	proxy_set_header $WSSN $host;
 
	#protect from slowhttptest -c 1000 -B -g -o my_server_stats -i 110 -r 200 -s 8192 -u http://youserver -x 20 -p 3
 
			client_max_body_size	   10m;
			client_body_buffer_size	128k;
			proxy_connect_timeout	  120;
			proxy_send_timeout		 120;
			proxy_read_timeout		 90;
			proxy_buffer_size		  4k;
			proxy_buffers			  4 32k;
			proxy_busy_buffers_size	64k;
			proxy_temp_file_write_size 64k;
		}
 
		# Static files location
		#location ~*^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)$
		#{
# root   /;
	   #}
 
	}
}
Поскольку под win nginx работает как стандартное консольное приложение, то надо было его поставить как сервис. В папочке nginx_service лежит xml файл nginx_service.xml
Код:
<service>
  <id>nginx</id>
  <name>nginx</name>
  <description>nginx web server</description>
  <executable>C:\nginx-1.10.0\nginx.exe</executable>
  <logpath>C:\nginx-1.10.0\nginx_service\</logpath>
  <logmode>roll</logmode>
  <depend></depend>
  <startargument>-p C:\nginx-1.10.0</startargument>
  <stopargument>-p C:\nginx-1.10.0 -s quit</stopargument>
</service>
и батник install_nginx_service.bat
Код:
cd c:\
cd nginx-1.10.0\nginx_service
nginx_service.exe install
nginx_service.exe start
Экзешник nginx_service.exe просто переименованный winsw-1.9-bin.exe, который позволяет установить любое консольное приложение как сервис по инструкциям xml. Качается . Подробнее об этом на Гитхабе.

Логи. С логами все сложно. access.log имеет свойство распухать на nginx до гиговых размеров и внятного ротирования не предусмотрено. Поэтому я решил, что "Буду бить аккуратно, но сыльно. Га-га-га-га! …КозЛАдоеу!", а именно nginx_log_rotate.bat запускать виндовым шедулером раз в месяц/неделю. Или раскомментировать #access_log off;
Код:
set DD=%DATE:~0,2%
set MM=%DATE:~3,2%
set YY=%DATE:~8,2%
set YYYY=%DATE:~6,4%
set HH=%TIME:~0,2%
set MN=%TIME:~3,2%
set folderdate=%YYYY%-%MM%-%DD%
net stop nginx
ren D:\nginx_logs\access.log access-%folderdate%.log
net start nginx

Ну и, естественно, ПЕРЕД пуском nginx в указанной конфигурации надо сделать в домине:
set conf HTTPEnableConnectorHeaders=1
te http restart

чтобы заработали
proxy_set_header $WSRA $remote_addr;
proxy_set_header $WSRH $remote_addr;
proxy_set_header $WSSN $host;
иначе ни в какую не хотел запускаться.
Хттп порт на домине переназначаем на 8080 (proxy_pass ). domlog.nsf, разумеется, отключен.

Все содержимое файла можно просто перписать в корень С:\ и позапускать необходимое (install_nginx_service.bat). Логи хранятся на D:\nginx_logs. Бонусом идет uninstall_nginx_service.bat.
Код:
net stop nginx
cd c:\
cd nginx-1.10.0\nginx_service
nginx_service.exe uninstall
Предложения принимаются. Слушаю внимательно).
 
Последнее редактирование модератором:

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
43
А вот кто-ть добился, что бы nginx поддерживал ETag совместно с gzip ?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
465
@rinsk, может в этом дело
 

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
43
... не все так радужно(
Настройка nginx для картинок\css\js

Код:
**********
 
location ~* \.(gif|ico|js|css|jpe?g|png)(\?[0-9]+)?$ {
 
proxy_cache imgcache;
 
proxy_cache_key $uri;
 
proxy_cache_revalidate on;
 
proxy_cache_min_uses 1;
 
proxy_ignore_headers Cache-Control;
 
proxy_cache_valid any 1h;
 
add_header X-Cache-Status $upstream_cache_status;
 
proxy_pass http://192.168.2.2:80;
 
}
 
*********

ответ от домино css, который в ресурсах css:
Код:
Cache-control:private
 
Connection:close
 
Content-Encoding:gzip
 
Content-Length:4174
 
Content-Type:text/css; charset=UTF-8
 
Date:Tue, 10 May 2016 18:02:59 GMT
 
ETag:W/"MTAtODEwNy00NTI1N0ZBQzAwMzdBMjk5LTQ1MjU3RkE5MDA2NkQ4QUEtRjlFOEVFMzdEQzY5RUM0NkMzMjU3NjU2MDAzM0NGRjItQ049ZGlzcF9PREtCL09VPVVTRVIvTz1FLU9ES0I="
 
Last-Modified:Tue, 10 May 2016 18:02:57 GMT
 
Server:Lotus-Domino
 
 
ответ от nginx:
 
Connection:close
 
Content-Encoding:gzip
 
Content-Length:4174
 
Content-Type:text/css; charset=UTF-8
 
Date:Tue, 10 May 2016 18:04:08 GMT
 
Expires:Tue, 01 Jan 1980 06:00:00 GMT
 
Last-Modified:Tue, 10 May 2016 18:04:08 GMT
 
Server:nginx/1.8.1
 
X-Cache-Status:MISS


и всегда этот файл отдается со статусом 200.
Что подмечено - для ресурсов, которые лежат в файловых ресурсах базы домино, все работает корректно. В чем различие - в заголовке Last-Modified, которое для css ресурса и для JS library == текущему времени, а для файлового ресурса - времени модификации ресурса:)
Шут с ним - с разницей с библой и файловым ресурсов (они пусть как бэ динамик контент) но интересно поведение nginx в данном случае.
Ниже - пример для query.textcomplete.css в файловом ресурсе:
****** ответ от домино:
Код:
Connection:close
 
Content-Encoding:gzip
 
Content-Length:244
 
Content-Type:text/css
 
Date:Tue, 10 May 2016 18:02:58 GMT
 
ETag:W/"MTAtMDAwMi0wLTQ1MjU3RjhFMDA2RUQyQ0ItOTVEMDk0MEMxNTkzOUZCMzQzMjU3RjhBMDA0MUFERTg="
 
Last-Modified:Thu, 07 Apr 2016 20:10:30 GMT
 
Server:Lotus-Domino

************* ответ от nginx
Код:
Connection:close
 
Content-Encoding:gzip
 
Content-Length:244
 
Content-Type:text/css
 
Date:Tue, 10 May 2016 18:04:08 GMT
 
ETag:W/"MTAtMDAwMi0wLTQ1MjU3RjhFMDA2RUQyQ0ItOTVEMDk0MEMxNTkzOUZCMzQzMjU3RjhBMDA0MUFERTg="
 
Last-Modified:Thu, 07 Apr 2016 20:10:30 GMT
 
Server:nginx/1.8.1
 
X-Cache-Status:HIT

- тут все норм.

Есть идеи?
 
Последнее редактирование модератором:

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
43
add - конечно эт лечится через HTTP response headers в доках сервера. Интересно как обойтись только энжином..
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
465
@rinsk не устраивает что он не оказался в кэше, при том что не менялся?
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
465
в конфе стоит игнор кэшконтрола, но мне не кажется это правильным...
домина отдает с префиксом приват и значит - расчет на кеширование клиентом
а вот клиенту это не доходит - он и не кэширует
 

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
43
- кешконтрол - ну тут я думал явно загнать ресурс априори статичный (по моему мнению)) в кеш прокси на долго, однако в этом случае прокси подчиняется директивам апстрима (домино считает его динамикой). т.е. я сам хочу рулить что и где кешировать.
И лечение простое Cache-control : Public на домино, что хотелось бы избежать...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
465
@rinsk, дык домина грит - что pivate потому нжинкс и "не трогает" (т.е. тупо считает что у него в кэше этого нет)
он сам могет перетереть эту директиву:
в конце там
[doublepost=1507643851,1462984516][/doublepost]********не относится к тексту выше*********
ssl на nginx , с опцией listen 443 ssl http2;
дает визуально ощутимый прирост скорости
т.о. можно полностью использовать nginx + ssl фронтом (доминошных бэк по http)
очень упрощает конфигурацию (не нужны многочисленные манипуляции)
добавляем в cron рута (sudo crontab -e)
35 0,12 * * * /opt/certbot-auto renew
и сертификат продляется автоматом
[doublepost=1507656939][/doublepost]пояснения по цифрам строки для крона есть по ссылке, транслирую сокращенно...
35 - минуты (это есть и в справке)
0,12 - дважды в день, по часам: в полночь, в полдень
[doublepost=1509641201][/doublepost]наткнулся на еще одну настройку (искал другое ;) )

вот это:
{
if ($request_method = POST) {
# use temporary to allow for POST to go through
# 301 will only work for GET/HEAD/OPTIONS
return 307
}
в каментах все написано
я вот и мучился с аяксовым снипетом, по авторизации через https, надеюсь этот кусок закроет траблу.
Ато я накостылил - создав обработчик не по месту (в error)
если интересуют детали - обработка ответа, после авторизации пользователя, через отправку POST, по https возвращалась ошибка...
кастыль лепил такой (xhr запрос)
JavaScript:
        dojo.xhrPost({
                url: loginurl,
                handleAs: "text",
                content: {
                    "username" : dojo.byId('#{id:username}').value,
                    "password" : dojo.byId('#{id:password}').value
                    },
                load : function(response, data) {
...
                        },
                error: function (error) {
                    //alert(error);
                    switch (error.status) {
                        case 0:
                            window.location.href = "#{javascript:compositeData.urlAfterLogin}";break;
                        case 302:
                            window.location.href = "#{javascript:compositeData.urlAfterLogin}";break;
                        default:alert(error);
                    }
                }
                });
и это меня угнетало ;)
 

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
43
Апyy темку - может кому то будет интересно:)
для меня было открытием. что nginx в бесплатной версии для балансировки может использовать "липкие" сессии.

upstream mhhost {
hash $cookie_LtpaToken;
server server1 ;
server server2 ;
}
....
location / {
proxy_pass http://mhhost;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
и фсе.
Теперь залогиненный пользователь всегда будет торчать на одном хосте)
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
43
Апyy темку - может кому то будет интересно:)
для меня было открытием. что nginx в бесплатной версии для балансировки может использовать "липкие" сессии.

upstream mhhost {
hash $cookie_LtpaToken;
server server1 ;
server server2 ;
}
....
location / {
proxy_pass http://mhhost;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
и фсе.
Теперь залогиненный пользователь всегда будет торчать на одном хосте)
Шаман!)))
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
465
Апyy темку - может кому то будет интересно:)
для меня было открытием. что nginx в бесплатной версии для балансировки может использовать "липкие" сессии.

upstream mhhost {
hash $cookie_LtpaToken;
server server1 ;
server server2 ;
}
....
location / {
proxy_pass http://mhhost;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
и фсе.
Теперь залогиненный пользователь всегда будет торчать на одном хосте)
просто добавлю
типа пояснения (не касающиеся кукисов ;) )
с кукисами - да, зачетный типс :)
останется "решить" с SSL... , как его балансить на фронте
 

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
43
Апyy темку - может кому то будет интересно:)
для меня было открытием. что nginx в бесплатной версии для балансировки может использовать "липкие" сессии.

upstream mhhost {
hash $cookie_LtpaToken;
server server1 ;
server server2 ;
}
....
location / {
proxy_pass http://mhhost;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
и фсе.
Теперь залогиненный пользователь всегда будет торчать на одном хосте)

Неожиданно вылезла бага с LtpaToken при включении SSL. а именно :
фронтэнд перевел на SSL. И более в конфиге ничего не делал.
и тут пошли ошибки типа "...Session expired" после логина на форме.
т е - вводится имя - пароль, делается submit формы и возвращается ошибка - что сессия устарела. Иногда - проходит нормально, иногда нужно повторить несколько раз.
Разбор ситуации привел к следующей мысли:
1 -делаем Logout . LtpToken очищается.
2 - форма логина открывается на любом из бакэнд серверов.
3 - делается POST на этот бакэнд.
4 - формируется LtpaToken
5 - и страница открывается на *другом* бакэнд сервере.
6 - этот сервер видимо не видит токен и пишет что авторизация устарела...

SSO настроен. Токен выпущен на весь домен...

Странно что это происходит только если фронт на SSL.

Теряюсь весь в догадках...
 

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
43
Неожиданно вылезла бага с LtpaToken при включении SSL. а именно :
фронтэнд перевел на SSL. И более в конфиге ничего не делал.
и тут пошли ошибки типа "...Session expired" после логина на форме.
т е - вводится имя - пароль, делается submit формы и возвращается ошибка - что сессия устарела. Иногда - проходит нормально, иногда нужно повторить несколько раз.
Разбор ситуации привел к следующей мысли:
1 -делаем Logout . LtpToken очищается.
2 - форма логина открывается на любом из бакэнд серверов.
3 - делается POST на этот бакэнд.
4 - формируется LtpaToken
5 - и страница открывается на *другом* бакэнд сервере.
6 - этот сервер видимо не видит токен и пишет что авторизация устарела...

SSO настроен. Токен выпущен на весь домен...

Странно что это происходит только если фронт на SSL.

Теряюсь весь в догадках...
Настройки SSL:
ssl_certificate /etc/nginx/cert/mis66_ru.full.crt;
ssl_certificate_key /etc/nginx/cert/mis66_ru.key;

# Improve HTTPS performance with session resumption
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

# Enable server-side protection against BEAST attacks
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384";

# RFC-7919 recommended:
#ssl_dhparam /etc/ssl/ffdhe4096.pem;
#ssl_ecdh_curve secp521r1:secp384r1;

# Aditional Security Headers
# ref:
#add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

# ref:
#add_header X-Frame-Options sameorigin always;

# ref:
#add_header X-Content-Type-Options nosniff always;

# ref:
#add_header X-Xss-Protection "1; mode=block" always;

# Enable OCSP stapling
# ref.
#ssl_stapling on;
#ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/cert/mis66_ru.full.crt;
 

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
43
Фух... сорян за панику - как то побился документ Web SSO Configurationю помогло только пересоздание (((
норм с SSL пашет кластер)
 
  • Нравится
Реакции: lmike

st060557

Green Team
01.04.2016
11
1
BIT
10
Добрый день. Столкнулся со следующей ошибкой в логе nginx на сервере Traveler:
[error] 324#1724: *682485 upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) while reading response header from upstream, client: "IP", server: "FQDN", request: "POST /traveler?action=push&deviceId=Android_ID HTTP/1.1", upstream: " ", host: "FQDN"
Устройства принимают, отправляют почту, просто хотелось бы разобраться. Поправьте, пожалуйста, если что-то неверно.
Конфигурация nginx такая:
Код:
worker_processes  1;
pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
  
    server {
        listen       80;
        server_name FQDN;
        return 301 https://$server_name$request_uri;
  
        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
  
    server {
        listen    443 ssl;
        server_name  FQDN;
        client_max_body_size 10M;
        ssl_certificate      bundle.crt;
        ssl_certificate_key  private.key;
        ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!MD5;
      
        location / {
            proxy_pass http://127.0.0.1:8088;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_set_header Accept-Encoding "";
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header $WSRA $remote_addr;
            proxy_set_header $WSRH $remote_addr;
            proxy_set_header $WSSN $host;
            proxy_connect_timeout 120;
            proxy_send_timeout 120;
            proxy_read_timeout 180;
        }
    }
}
 
Последнее редактирование:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
465
а тераелер слушает на этом порту?
и еще момент - современные устройства обращаются по https (и еще нужен валидный сепртификат), у вас только http обрабатывается
 

st060557

Green Team
01.04.2016
11
1
BIT
10
а тераелер слушает на этом порту?
и еще момент - современные устройства обращаются по https (и еще нужен валидный сепртификат), у вас только http обрабатывается
Да, на нём слушает. https работает, сертификат прикручен.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
465
Да, на нём слушает. https работает, сертификат прикручен.
дословно - сервер не дождался ответ, причин может быть масса...
по-умолчанию у нжинкса достаточное время ожидания, может проблема в устойчивости соединения (хотя это и локалхост, а потому - странно)
на какой ОС сервер? Надо учитывать - винда для нжинкс не рекомендуемая платформа
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!