Базовая проверка подлинности прокси-сервера Apache Traffic Server

Я пытаюсь настроить прямой прокси-сервер с базовой прокси-аутентификацией, используя Apache Traffic Server (ATS) на CentOS 6. Я уже успешно развернул прямые прокси-серверы SQUID и Apache httpd mod_proxy с базовой прокси-аутентификацией и хочу выполнить То же самое с ATS для сравнения производительности.

Я пытаюсь использовать пример плагина basic-auth, предоставленный ATS, с несколькими проблемами.

Я добавляю последнюю версию репозитория epel для CentOS 6 и устанавливаю пакеты trafficserver и trafficserver -devel (требуется использовать компилятор ATS, tsxs). Я копирую файл basic-auth.c из исходного кода в каталог пользователя и пытаюсь скомпилировать:

# tsxs -v -o /root/basic-auth.so -c /root/basic-auth.c

После чего я получаю ошибки для файлов, не найденных - ts/ink_defs.h

Этот файл генерируется запуском autoconfig -if а также configure на исходный код - так что я пошел вперед и клонировал git-репозиторий на сервере трафика и побежал по шагам, чтобы сделать несколько сотен файлов в /opt/ts/, Я скопировал их в каталог, на который смотрит tsxs - /usr/include/ts/ (это здесь, потому что это местоположение по умолчанию при установке с помощью trafficserver-devel (когда я ранее только устанавливал сервер трафика из источника, tsxs не запускался).

Теперь, когда файлы на месте, я снова запустил компилятор на basic-auth.cc. На этот раз я получаю ошибки в ts.h из-за параметра sdk_version:

# tsxs -v -o basic-auth.so basic-auth.c
  compiling basic-auth.c -> basic-auth.lo
cc -I/usr/include -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -feliminate-unused-debug-symbols -fno-strict-aliasing -mcx16 -fpic -c basic-auth.c -o basic-auth.lo
In file included from basic-auth.c:30:
/usr/include/ts/ts.h:158: error: expected ‘)’ before ‘sdk_version’
In file included from /usr/include/ts/ink_defs.h:28,
                 from basic-auth.c:31:
/usr/include/ts/ink_config.h:41:26: error: ink_autoconf.h: No such file or directory
basic-auth.c: In function ‘TSPluginInit’:
basic-auth.c:222: warning: implicit declaration of function ‘TSPluginRegister’
tsxs: compilation failed: cc -I/usr/include -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -feliminate-unused-debug-symbols -fno-strict-aliasing -mcx16 -fpic -c basic-auth.c -o basic-auth.lo

Я исследовал код для ts.h и сравнил его с последним источником. Вы можете видеть, что строка 156 изменяется:

trafficserver-разви:

tsapi TSReturnCode TSPluginRegister(TSSDKVersion sdk_version, TSPluginRegistrationInfo plugin_info);

источник:

tsapi TSReturnCode TSPluginRegister(TSPluginRegistrationInfo *plugin_info);

Следовательно, я предполагаю, что есть какая-то проблема с версионированием. Я заменил свою версию ts.h на последний источник и снова попытался скомпилировать: это работает!

Я копирую файл.so в каталог плагинов и изменяю соответственно plugins.config и records.config. Увы, когда я пытаюсь запустить сервер трафика, происходит сбой из-за ошибки сегментации:

# /usr/bin/traffic_server
traffic_server: using root directory '/usr'
[Jul 15 16:19:21.224] Server {0x7fd9458ba7e0} DEBUG: (dns) ink_dns_init: called with init_called = 0
[Jul 15 16:19:21.227] Server {0x7fd9458ba7e0} DEBUG: (dns) localhost=vmProxy1
[Jul 15 16:19:21.227] Server {0x7fd9458ba7e0} DEBUG: (dns) Round-robin nameservers = 1
traffic_server: Segmentation fault (Signal sent by the kernel [(nil)])traffic_server - STACK TRACE:
/usr/bin/traffic_server(_Z19crash_logger_invokeiP7siginfoPv+0x99)[0x4a5209]
/lib64/libpthread.so.0[0x35b600f710]
/lib64/libc.so.6[0x35b5d3362f]
/usr/lib64/trafficserver/libtsutil.so.5(_xstrdup+0x6d)[0x7fd945f2b6cd]
/usr/bin/traffic_server(TSPluginRegister+0x7c)[0x4bcb6c]
/usr/lib64/trafficserver/plugins/basic-auth.so(TSPluginInit+0x2f)[0x7fd942334e1f]
/usr/bin/traffic_server(_Z11plugin_initb+0x322)[0x4dab22]
/usr/bin/traffic_server(main+0x1424)[0x4d2754]
/lib64/libc.so.6(__libc_start_main+0xfd)[0x35b5c1ed5d]
/usr/bin/traffic_server[0x4942a9]
Segmentation fault (core dumped)

Я пытался использовать GDB, чтобы получить лучший журнал отладки, но я не вижу ничего полезного. Есть еще одно упоминание о sdk_version - но я начинаю думать, что обход файлов и их замена - это не то, как это должно работать...

Starting program: /usr/bin/traffic_server
[Thread debugging using libthread_db enabled]
traffic_server: using root directory '/usr'
[New Thread 0x7ffff7704700 (LWP 19967)]
[Jul 15 16:18:28.841] Server {0x7ffff77777e0} DEBUG: (dns) ink_dns_init: called with init_called = 0
[New Thread 0x7ffff68ff700 (LWP 19968)]
[New Thread 0x7ffff67fe700 (LWP 19969)]
[Jul 15 16:18:28.844] Server {0x7ffff77777e0} DEBUG: (dns) localhost=vmProxy1
[Jul 15 16:18:28.844] Server {0x7ffff77777e0} DEBUG: (dns) Round-robin nameservers = 1
[New Thread 0x7ffff46f5700 (LWP 19970)]
[New Thread 0x7ffff44f3700 (LWP 19971)]

Program received signal SIGSEGV, Segmentation fault.
__strlen_sse42 () at ../sysdeps/x86_64/multiarch/strlen-sse4.S:32
32              pcmpeqb (%rdi), %xmm1
Missing separate debuginfos, use: debuginfo-install tcl-8.5.7-6.el6.x86_64
(gdb) bt
#0  __strlen_sse42 () at ../sysdeps/x86_64/multiarch/strlen-sse4.S:32
#1  0x00007ffff7de86cd in _xstrdup (str=0xd46e3934ae7d6389 <Address 0xd46e3934ae7d6389 out of bounds>, length=-1)
    at ink_memory.cc:231
#2  0x00000000004bcb6c in TSPluginRegister (sdk_version=<value optimized out>, plugin_info=0x7fffffffcc50)
    at InkAPI.cc:1803
#3  0x00007ffff41f1e1f in TSPluginInit (argc=<value optimized out>, argv=<value optimized out>) at /root/basic-auth.c:222
#4  0x00000000004dab22 in plugin_load (validateOnly=false) at Plugin.cc:114
#5  plugin_init (validateOnly=false) at Plugin.cc:265
#6  0x00000000004d2754 in main (argv=<value optimized out>) at Main.cc:1714

Любые советы или подсказки о том, что я могу делать неправильно, очень ценятся.

1 ответ

Решение

Да, это несколько неудачно, но примеры в дереве исходных текстов не предназначены для компиляции с помощью tsxs. Вам нужно внести несколько изменений в код, чтобы он работал. Например, посмотрите этот коммит git, который я сделал в примере version.c:

diff --git a/example/version/version.c b/example/version/version.c
index f5c8126..4020a0c 100644
--- a/example/version/version.c
+++ b/example/version/version.c
@@ -24,10 +24,9 @@
 #include <stdio.h>

 #include "ts/ts.h"
-#include "ts/ink_defs.h"

 void
-TSPluginInit(int argc ATS_UNUSED, const char *argv[] ATS_UNUSED)
+TSPluginInit(int argc , const char *argv[])
 {
   TSPluginRegistrationInfo info;

Что касается информации о версии, то она была удалена для ATS v6.0.0, что означает, что для ее удаления также необходимо изменить старые плагины. Это также делает ранее созданные двоичные файлы несовместимыми. Вероятно, есть и лучшие инструменты, чем tsxs, включая поддержку pkgconfig и traffic_layout.

Другие вопросы по тегам