1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/calvinwilliams-hetao

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Разработка и тестирование программного обеспечения: Hetao

1. Введение

В данном документе описывается разработка и тестирование веб-приложения Hetao, которое предназначено для автоматизации определённых процессов в бизнесе.

2. Обзор

2.1. Hetao — это веб-приложение, разработанное с использованием современных технологий и методов программирования. Оно обеспечивает удобный и эффективный способ управления бизнес-процессами.

2.2. Hetao поддерживает различные платформы и операционные системы, что делает его доступным для широкого круга пользователей.

2.3. Приложение Hetao разработано с учётом требований безопасности и надёжности.

3. Установка и настройка

3.1. Linux * 3.1.1. Загрузка исходного кода. * 3.1.2. Настройка среды разработки. * 3.1.3. Компиляция и установка приложения. * 3.1.4. Тестирование на первом этапе. * 3.1.5. Использование готовых библиотек и компонентов. * 3.1.6. Оптимизация производительности. 3.2. Windows * 3.2.1. Создание виртуальной среды. * 3.2.2. Загрузка исходных файлов. * 3.2.3. Запуск приложения. * 3.2.4. Тестирование первого этапа. * 3.2.5. Отладка и исправление ошибок. * 3.2.6. Использование мини-версии Hetao для тестирования.

4. Документация

4.1. Руководство пользователя и справочная информация. 4.2. Техническая документация. 4.3. Сетевые настройки и конфигурация. * 4.3.1. Базовая конфигурация сети. * 4.3.2. Настройки для конкретных серверов. * 4.3.3. Изменение URI. * 4.3.4. Замена доменных имён. * 4.3.5. HTTPS. * 4.3.6. Противоположная обработка документов. * 4.3.7. Противоположная обработка документов с передачей по времени и завершением HTTPS. * 4.3.8. SOCGI. * 4.3.9. Разделение URI. 4.4. ... 4.5. Тестирование программного обеспечения

  • 4.5.1. Тестирование ПО по видам
    • Функциональное тестирование
    • Нефункциональное тестирование:
      • Нагрузочное тестирование
      • Тестирование производительности
      • Стресс-тестирование
      • Юзабилити-тестирование
      • Тестирование безопасности
      • Инсталляционное тестирование
      • Конфигурационное тестирование

5. Обслуживание системы

  • 5.1. Прямая связь с пользователями
  • 5.2. Самостоятельная регистрация пользователей
  • 5.3. Использование minihetao для прямой связи и самостоятельной регистрации пользователей без необходимости тестирования ПО

6. Расширение использования

  • 6.1. SOCGI — расширение использования путём внедрения

    • 6.1.1. Жизненный цикл обработки запроса
    • 6.1.2. HTTP-запрос: обработка и анализ данных в верхней части рисунка
  • 6.2. SOCGI — использование расширения

    • 6.2.1. Рабочие области
      • 6.2.1.1. Обработка строк: сравнение, поиск, замена, возврат новой строки
        • STRNCMPSTRN
        • STRNEQSTR
        • STRNEQRSTR
        • HTTP_RETURN_NEWLINE
        • HTML_NEWLINE
        • HTML_RETURN_NEWLINE
        • BUFNPRINTF
        • BUFPRINTF
        • BUFNSTRCAT
        • BUFSTRCAT
    • 6.2.2. API-функции
      • 6.2.2.1. Ответ HTTP-запроса: обработка и передача информации
        • SOCGIFormatHttpResponse
      • 6.2.2.2. HTTP-запросы: получение и обработка информации
        • SOCGIGetHttpHeaderPtr_METHOD
        • SOCGIGetHttpHeaderPtr_URI
        • SOCGIGetHttpHeaderPtr_VERSION
        • SOCGIQueryHttpHeaderPtr
        • SOCGITravelHttpHeaderPtr
        • SOCGIGetHttpHeaderNamePtr
        • SOCGIGetHttpHeaderValuePtr
        • SOCGIGetHttpBodyPtr
      • 6.2.2.3. Прочие функции
        • SOCGIGetConfigPathfilename
        • SOCGISetUserData
        • SOCGIGetUserData
  • 6.3. RESTful — расширение использования путём внедрения

  • 6.4. RESTful — использование расширения

    • 6.4.1. Рабочие области

      • 6.4.1.1. Методы HTTP
    • 6.4.2. Функции API

      • 6.4.2.1. RESTful — функции API: активация и деактивация
        • funcRestServiceEntry RESTful
    • 6.4.3.1.1. RESTCreateRestServiceControler

    • 6.4.3.1.2. RESTDispatchRestServiceController

    • 6.4.3.1.3. RESTDestroyRestServiceController

    • 6.4.3.2. ѯRESTful������Ϣ��

      • 6.4.3.2.1. RESTGetHttpMethodPtr
      • 6.4.3.2.2. RESTGetHttpUriPtr
      • 6.4.3.2.3. RESTGetHttpUriPathsCount
      • 6.4.3.2.4. RESTGetHttpUriPathPtr
      • 6.4.3.2.5. RESTGetHttpUriQueriesCount
      • 6.4.3.2.6. RESTGetHttpUriQueryKeyPtr
      • 6.4.3.2.7. RESTGetHttpUriQueryValuePtr
      • 6.4.3.2.8. RESTGetHttpRequestBodyPtr
    • 6.4.3.3. ����RESTful��Ӧ��Ϣ��

      • 6.4.3.3.1. RESTFormatHttpResponse
    • 6.4.3.4. ������

      • 6.4.3.4.1. RESTGetHttpEnv

7. ѹ��

- **7.1. ѹ�⻷��**
    - **7.1.1. ѹ��ƽ̨**
    - **7.1.2. ѹ��ͻ���**
    - **7.1.3. ѹ������**  

— - 7.2. ѹ�ⷽ��
— - 7.3. ѹ�����
— - 7.4. ѹ����

8. �ڲ�ʵ��

- **8.1. ���̺��߳̽ṹ**  

— - 8.2. �������ù�ϵͼ - 8.2.1. �������ʼ�� - 8.2.2. �������� - 8.2.3. ��������

9. ���

Версия Дата Описание
v1.0.0 2016-08-08
v1.0.1 2016-08-17 Добавлено: ѹ��
v1.0.2 2016-08-20 Добавлено: �ڲ�ʵ��
v1.0.3 2016-08-28 Добавлено: ����ϵͳ����
����ѹ��
v1.0.4 2016-09-01
v1.0.5 2016-09-04
v1.0.6 2016-09-06 Добавлено: ��д ��վ����
v1.0.7 2016-09-07
v1.0.8 2016-09-08
v1.0.9 2016-09-10 Добавлено: hetao/0.7.0ѹ��
���������������
��� hetao/0.8.0����������˵��
v1.0.10 2016-09-11
v1.0.11 2016-09-18 Обновлено: hetao до версии 0.8.0
v1.0.12 2016-10-07 Для Windows (VS2008)
v1.0.13 2016-10-13 Для Windows, minihetao
v1.0.14 2016-10-15
v1.0.15 2016-10-17 Для Windows, minihetao
v1.0.16 2016-10-21
v1.0.17 2016-10-22
v1.0.18 2020-03-15 С поддержкой SOCGI
v1.0.19 2020-04-05 hetao v0.1.0.0
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -o libhetao_socgi.so HttpApplicationContext.o RestServiceContext.o RestServiceControler.o -shared -L. -lpcre -lpthread -lssl -lcrypto -lz -ldl
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c hetaocheckconf.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c IDL_hetao_conf.dsc.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c Util.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c Config.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -o hetaocheckconf hetaocheckconf.o list.o LOGC.o fasterjson.o fasterhttp.o IDL_hetao_conf.dsc.o Util.o Config.o libhetao_util.so -L. -lpcre -lpthread -lssl -lcrypto -lz -ldl
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c hetaocheckso.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -o hetaocheckso hetaocheckso.o list.o LOGC.o fasterjson.o fasterhttp.o IDL_hetao_conf.dsc.o Util.o Config.o libhetao_util.so -L. -lpcre -lpthread -lssl -lcrypto -lz -ldl
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c minihetao.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c Envirment.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c MonitorProcess.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c WorkerProcess.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c WorkerThread.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c TimerThread.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c OnAcceptingSocket.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c OnAcceptingSslSocket.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c OnReceivingSocket.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strong-aliasing -I. -c OnSendingSocket.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c ProcessHttpRequest.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c OnConnectingForward.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c OnConnectingSslForward.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c OnSendingForward.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c OnReceivingForward.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c VirtualHostHash.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c ListenSession.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c HttpSession.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c HtmlCacheSession.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c HtmlCacheEventHander.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c HtmlCacheWdTree.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c HtmlCachePathfilenameTree.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c HttpSessionTimeoutTree.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c HttpSessionElapseTree.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c LeastConnectionCountTree.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c MimeTypeHash.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c RewriteUri.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c RedirectDomain.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c IpLimitsHash.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -o minihetao minihetao.o IDL_hetao_conf.dsc.o Util.o Config.o Envirment.o MonitorProcess.o WorkerProcess.o WorkerThread.o TimerThread.o OnAcceptingSocket.o OnAcceptingSslSocket.o OnReceivingSocket.o OnSendingSocket.o ProcessHttpRequest.o OnConnectingForward.o OnConnectingSslForward.o OnSendingForward.o OnReceivingForward.o VirtualHostHash.o ListenSession.o HttpSession.o HtmlCacheSession.o HtmlCacheEventHander.o HtmlCacheWdTree.o HtmlCachePathfilenameTree.o HttpSessionTimeoutTree.o HttpSessionElapseTree.o LeastConnectionCountTree.o MimeTypeHash.o RewriteUri.o RedirectDomain.o IpLimitsHash.o libhetao_util.so -L. -lpcre -lpthread -lssl -lcrypto -lz -ldl
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c hetao.c -Werror -fno-strict-aliasing -o hetao hetao.o IDL_hetao_conf.dsc.o Util.o Config.o Envirment.o MonitorProcess.o WorkerProcess.o WorkerThread.o TimerThread.o OnAcceptingSocket.o OnAcceptingSslSocket.o OnReceivingSocket.o OnSendingSocket.o ProcessHttpRequest.o OnConnectingForward.o OnConnectingSslForward.o OnSendingForward.o OnRecevingForward.o VirtualHostHash.o ListenSession.o HttpSession.o HtmlCacheSession.o

HtmlCacheEventHander.o HtmlCacheWdTree.o HtmlCachePathfilenameTree.o HttpSessionTimeoutTree.o HttpSessionElapseTree.o LeastConnectionCountTree.o MimeTypeHash.o RewriteUri.o RedirectDomain.o IpLimitsHash.o libhetao_util.so -L. -lpcre -lpthread -lssl -lcrypto -lz -ldl

rm -f /usr/bin/hetaocheckconf cp -rf hetaocheckconf /usr/bin/ rm -f /usr/bin/hetaocheckso cp -rf hetaocheckso /usr/bin/ rm -f /usr/bin/minihetao cp -rf minihetao /usr/bin/ rm -f /usr/bin/hetao cp -rf hetao /usr/bin/ mkdir -p /usr/include/hetao cp -rf hetao_socgi.h /usr/include/hetao/ cp -rf hetao_rest.h /usr/include/hetao/ cp -rf LOGC.h /usr/include/hetao/

mkdir -p /var/hetao mkdir -p /var/hetao/log rm -f /usr/bin/../bin/hetao.sh cp -rf ../bin/hetao.sh /usr/bin/ mkdir -p /etc/hetao cp -rf ../conf/hetao.conf /etc/hetao/ mkdir -p /etc/hetao/certs cp -rf ../certs/gencert.sh /etc/hetao/certs/ cp -rf ../certs/server.crt /etc/hetao/certs/ cp -rf ../certs/server.csr /etc/hetao/certs/ cp -rf ../certs/server.key /etc/hetao/certs/ cp -rf ../certs/server.pem /etc/hetao/certs/ mkdir -p /var/hetao/www cp -rf ../www/error_pages /var/hetao/www/ cp -rf ../www/index.html /var/hetao/www/ make[1]: �뿪Ŀ¼��/home/calvin/src/hetao/src�� make[1]: ����Ŀ¼��/home/calvin/src/hetao/test�� make[2]: ����Ŀ¼��/home/calvin/src/hetao/test/test_socgi_hello�� gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -I/root/include -I/usr/include/hetao -c test_socgi_hello.c gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -o test_socgi_hello.socgi test_socgi_hello.o -shared -L. -L/root/lib -L/usr/lib64 -lhetao_socgi hetaocheckso ./test_socgi_hello.socgi -r OK cp -rf test_socgi_hello.socgi /var/hetao/www/ make[2]: �뿪Ŀ¼��/home/calvin/src/hetao/test/test_socgi_hello�� make[2]: ����Ŀ¼��/home/calvin/src/hetao/test/test_socgi_rest_hello�� gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -I/root/include -I/usr/include/hetao -c test_socgi_rest_hello.c gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -o test_socgi_rest_hello.socgi test_socgi_rest_hello.o -shared -L. -L/root/lib -L/usr/lib64 -lhetao_socgi hetaocheckso ./test_socgi_rest_hello.socgi -r OK cp -rf test_socgi_rest_hello.socgi /var/hetao/www/ make[2]: �뿪Ŀ¼��/home/calvin/src/hetao/test/test_socgi_rest_hello�� make[2]: ����Ŀ¼��/home/calvin/src/hetao/test/test_socgi_rest_full�� gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -I/root/include -std=gnu99 -I/usr/include/hetao -c util.c ...

К сожалению, не удалось перевести часть текста, так как он содержит фрагменты кода на языке программирования. ``` "listen": { "ip": "", "port": 443, "ssl": { "certificate_file": "/etc/hetao/certs/server.pem", "certificate_key_file": "/etc/hetao/certs/server.key" }, "website": { "domain": "", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log" } },

"listen": { "ip": "", "port": 80, "website": { "domain": "", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log", "redirect": { "domain":"www.test.com", "new_domain":"http://www.test2.com"} } },

"listen": { "ip": "", "port": 80, "website": { "domain": "www.test.com", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log" } },

"listen": { "ip": "", "port": 80, "website": { "domain": "www.test2.com", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log" } },

"listen": { "ip": "", "port": 80, "website": { "domain": "", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log", "rewrite": { "pattern":"/(.+)/(.+)", "new_uri":"/(2)/(1)" } } },

"listen": { "ip": "", "port": 80, "website": { "domain": "", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log", "forward": { "forward_type": "php", "forward_rule": "R", "forward_server": { "ip": "127.0.0.1", "port": 8081 }, "forward_server": { "ip": "127.0.0.1", "port": 8082 }, "forward_server": { "ip": "127.0.0.1", "port": 8083 } } } }, "listen": { "ip": "", "port": 8081, "website": { "domain": "", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log" } }, "listen": { "ip": "", "port": 8082, "website": { "domain": "", "wwwroot": "/var/hetao/www/mydir", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log" } }, "listen": { "ip": "", "port": 8083, "website": { "domain": "", "wwwroot": "/var/hetao/www/mydir/mydir2", "index": "/index.html,/index.htm", "access_log": "/var/hetaо/log/access.log" } },

"listen": { "ip": "", "port": 80, "website": { "domain": "", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log", "forward": { "forward_type": "php", "forward_rule": "R", "ssl": { "certificate_file": "/etc/hetao/certs/server.pem", "certificate_key_file": "/etc/hetao/certs/server.key" }, "forward_server": { "ip": "127.0.0.1", "port": 8081 }, "forward_server": { "ip": "127.0.0.1", "port": 8082 }, "forward_server": { "ip": "127.0.0.1", "port": 8083 } } } } "listen": { "ip": "", "port": 80, "website": { "domain": "", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log", "socgi": { "socgi_type": "socgi", "socgi_config_pathfilename": "conf/test.conf", "socgi_bin_pathfilename": "/var/hetao/www/test_socgi_hello.socgi" } } },

"listen": { "ip": "", "port": 80, "website": { "domain": "", "wwwroot": "www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log", "socgi": { "socgi_type": "socgi", "socgi_bin_pathfilename": "www/test_socgi_demo_check_token.socgi" } } },

"listen": { "ip": "", "port": 80, "website": { "domain": "", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log", "socgi": { "socgi_bin_pathfilename": "/var/hetao/www/test_socgi_rest_hello.socgi" } } },

"listen": { "ip": "", "port": 80, "website": { "domain": "", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log", "socgi": { "socgi_bin_pathfilename": "/var/hetao/www/test_socgi_rest_full.socgi" } } },

"listen": { "ip": "", "port": 80, "website": { "domain": "", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log", "location": { "location": "^/mydir[/]?$", "redirect": { "domain":"www.test.com", "new_domain":"http://www.test2.com"} }, "location": { "location": "^/mydir/[^/]+/[^/]+$", "rewrite": {"pattern":"/(.+)/(.+)/(.+)", "new_uri":"/(1)/(3)/(2)"} } }, "website": { "domain": "www.test.com", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log" }, "website": { "domain": "www.test2.com", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log" } },

"listen": { "ip": "", "port": 80, "website": { "domain": "", "wwwroot": "/var/hetao/www", "index": "/index.html,/index.htm", "access_log": "/var/hetao/log/access.log", "location": { "location": "^/mydir[/]?$", "forward": { "forward_type": "html", "forward_rule": "R", "forward_server": {"ip": "127.0.0.1", "port": 8081} } } } }

| --- | --- |
| worker_processes | Linux�����������Ĺ����������������Ϊ-1������ΪCPU��������ȱʡֵΪ1 |
| cpu_affinity | ���Ϊ1�����ӽ��̰���CPU�ϣ����Ϊ0�����󶨣�ȱʡֵΪ1 |
| accept_mutex | ���Ϊ1������������ת����ֹ���ӽ�����epoll��Ⱥ�������CPU���Ըߺģ�ÿ��ֻ��һ���������̴��ڽ�����һ��TCP������״̬�����������ѡһ��ĿǰHTTP�Ự���ٵĹ������̵������Σ�ȱʡֵΪ0 |
| error_log | ��ϸ��־�ļ�����֧��$...$��������չ������������Ŀ¼�ļ������������Ƕ����������ȱʡֵΪ�� |
| log_level | ��ϸ��־�ļ��ڵ���־�ȼ���ö����DEBUG��INFO��WARN��ERROR��FATAL��ȱʡֵΪERROR |
| user | �������Ը��û����ݣ���ѡ���ã���ȱʡֵΪ"nobody" |
| limits | �������� |
| -   max_http_session_count | ���HTTPͨѶ�Ự����������ȱʡֵΪ100000 |
| -   max_file_cache | ��󻺴��ļ���С��ȱʡֵΪ1024000 |
| -   max_connections_per_ip | ÿ��IP������������ƣ�-1Ϊ�����ƣ�ȱʡֵΪ-1 |
| -   headers_count_hardmax | HTTP�������ͷ������ȱʡֵΪ128 |
| -   headers_len_hardmax | HTTP�������ͷѡ���С��ȱʡֵΪ4KB |
| -   header_content_length_val_hardmax | HTTP����������С��ȱʡֵΪ4MB |
| listen | ����������ַ |
| -   ip | ���������˿ڣ������Ϊ0.0.0.0 |
| -   port | ���������˿� |
| -   ssl | ����˰�ȫ���ܹ��򣨿�ѡ���ÿ飩 |
| -   -   certificate_file | ��Կ֤���ļ��� |
| -   -   certificate_key_file | ˽Կ�ļ��� |
| website [] | ��վ���ã�һ����·������ַ��������ж����վ |
| -   domain | ��վ����������ƥ��HTTP����ͷѡ��Host����������������������ͳ������ |
| wwwroot | ��վ���ظ�Ŀ¼ |
| index | ��������������Ŀ¼�����Ե�����ļ�����ʽΪ"/index.html"������ж�������ʽΪ"/index.html,/index.htm,..."��ע�⣺����ļ���ǰ��"/" |
| access_log | �¼���־�ļ�����һ��HTTP����дһ���¼���־ |
| redirect | �����ض�����򣨿�ѡ���ÿ飩 |
| new_domain | �ض�����������"http://www.test2.com/" |
| rewrite | ��дURI���򣨿�ѡ���ÿ飩 |
| pattern | ԭURI����ƥ��ʽ����"/(.+)/(.+)" | **Новый URI**|  URI  |"/(2)/(1)"|
|---|---|---|
**forward**| |
**forward_type**| |'.'|
**forward_rule**| |R|L|
**ssl**| |
**certificate_file**| |
**forward_server []**| |
- **ip**| |
- **port**| |
**socgi**| |HTTP|SOCGI|'.'|RESTful|
**socgi_type**| SOCGI|'Դ'|'ļ���չ����������'.'��������������ͬRESTfulЧ��|
**socgi_config_pathfilename**| |
**socgi_bin_pathfilename**| |
**location**| |URI|
- **redirect**| |
- **rewrite**| |дURI|
- **forward**| |
- **socgi**| |HTTP|SOCGI|
**tcp_options**| TCP|
- **nodelay**| |TCP_NODELAY|
- **linger**| |SO_LINGER|
**http_options**| HTTP|
- **compress_on**| |Ѷ����������ȱʡֵΪ1|
- **timeout**| HTTP||λ���룻ȱʡֵΪ30|
- **elapse**| HTTP||λ���룻ȱʡֵΪ60|
- **forward_disable**| |λ���룻ȱʡֵΪ60|
**error_pages**| |
- **error_page_???**| HTTP|||400|401|403|404|408|500|503|505|
**mime_types**| |HTTP||Content-Type|
- **mime_type []**| | |
  - **type**| | |
   - **mime**| |HTTP||Content-Type|
   - **compress_enable**| |ѹ�����с1|ѹ���������ֻ�0Ϊ��ѹ��|

## 4.2. Пример конфигурации

$ cat conf/hetao.conf.Linux.minimize { "listen" : { "ip" : "" , "port" : 80 , "website" : { "domain" : "" , "wwwroot" : "/var/hetao/www" , "index" : "/index.htm,/index.html" , "access_log" : "/var/hetao/log/access.log" } } }


## 4.3. Описание структуры

Структура:
* listen — веб-сайт (website) — forward_server (перенаправление запросов).

Listen отвечает за обработку запросов, website содержит информацию о сайте, а forward_server перенаправляет запросы на другие сервера.

В listen указываются параметры IP и port для прослушивания порта. В website задаются параметры домена, wwwroot, index и access_log.

Домен — это адрес сайта, например, «www.google.com» или «192.168.1.110:8080». **Ответ:**

    "do", "socgi_bin_pathfilename": "www/test_socgi_hello.socgi"
}
}

RESTful

    {
        "listen":
        {
            "ip": "",
            "port": 80,
            "website":
            {
                "domain": "localhost",
                "wwwroot": "www",
                "index": "/index.html,/index.htm",
                "access_log": "log/access.log",
                "socgi":
                {
                    "socgi_type": "", "socgi_bin_pathfilename": "www/test_socgi_rest_full.socgi"
                }
            }
        }
    }

RESTful
### 4.3.9. URI

website — redirect — rewrite — forward — socgi

URI — hetao — URI — redirect — rewrite — forward — socgi —

    «listen»:
    {
        «ip»: "",
        «port»: 80,
        «website»:
        {
            «domain»: "",
            «wwwroot»: «/var/hetao/www»,
            «index»: «/index.html,/index.htm»,
            «access_log»: «/var/hetao/log/access.log»,
            «location»:
            {
                «location»: "^/mydir[/]?$",
                «redirect»: {«domain»: "www.test2.com", «new_domain»: "http://www.test2.com"}
            },
            «location»:
            {
                «location»: "^/mydir/[^/]+/[^/]+$",
                «rewrite»: {«pattern»: "(.+)/(.*)/(.*)", «new_uri»: "(1)/(3)/(2)"}
            }
        },
        «website»:
        {
            «domain»: «www.test2.com»,
            «wwwroot»: "/var/hetao/www",
            «index»: "/index.html,/index.htm",
            «access_log»: "/var/hetao/log/access.log"
        }
    },

URI — /mydir — www.test.com — http://www.test2.com

    «listen»:
    {
        «ip»: "",
        «port»: 80,
        «website»:
        {
            «domain»: "",
            «wwwroot»: "/var/hetao/www",
            «index»: "/index.html,/index.htm",
            «access_log»: "/var/hetao/log/access.log",
            «location»:
            {
                «location»: "^/mydir[/]?$",
                «forward»:
                {
                    «forward_type»: "html",
                    «forward_rule»: "R",
                    «forward_server»: {«ip»: "127.0.0.1", «port»: 8081},
                    «forward_server»: {«ip»: "127.0.0.1", «port»: 8082}
                }
            },
            «location»:
            {
                «location»: "^/mydir/[^/]+/[^/]+$",
                «forward»:
                {
                    «forward_type»: "html",
                    «forward_rule»: "R",
                    «forward_server»: {«ip»: "127.0.0.1", «port»: 8081},
                    «forward_server»: {«ip»: "127.0.0.1", «port»: 8082},
                    «forward_server»: {«ip»: "127.0.0.1", «port»: 8083}
                }
            }
        }
    },
    «listen»:
    {
        «ip»: "",
        «port»: 8081,
        «website»:
        {
            «domain»: "",
            «wwwroot»: "/var/hetao/www",
            «index»: "/index.html,/index.htm",
            «access_log»: "/var/hetao/log/access.log"
        }
    },
    «listen»:
    {
        «ip»: "",
        «port»: 8082,
        «website»:
        {
            «domain»: "",
            «wwwroot»: "/var/hetao/www",
            «index»: "/index.html,/index.htm",
            «access_log»: "/var/hetao/log/access.log"
        }
    },
    «listen»:
    {
        «ip»: "",
        «port»: 8083,
        «website»:
        {
            «domain»: "",
            «wwwroot»: "/var/hetao/www",
            «index»: "/index.html,/index.htm",
            «access_log»: "/var/hetao/log/access.log" ```
/var/hetao/log/access.log
}
},

4.4. Мини-хето

Читаем файл hetao.conf в директории /etc/hetao:

!include filename

или

!include "filename"

где filename — это имя файла конфигурации, а именно hetao.conf.

Содержимое файла hetao.conf:

    "website": {
        "domain": "",
        "wwwroot": "/var/hetao/www",
        "index": "/index.html,/index.htm",
        "access_log": "/var/hetao/log/access.log",
        !include hetao_redirect.conf
        ...

Файл hetao_redirect.conf содержит следующие данные:

            redirect { "domain":"www.google.com", "new_domain":"www.baidu.com" }

Примечание: символы после «json» не переведены.

4.5. Проверка конфигурации

Проверка конфигурации с помощью команды hetaocheck:

$ hetaocheck /etc/hetao/hetao.conf
OK

Если проверка прошла успешно, выводится сообщение OK. В противном случае — сообщение об ошибке.

Пример вывода сообщения об ошибке:

$ hetaocheck /etc/hetao/hetao.conf
2016-03-27 01:12:10 | ERROR | 14309:3086837744:Config.c:163 | DSCDESERIALIZE_JSON_hetao_conf failed[-134][0] , errno[0]
FAILED[-1]

5. Управление процессом

5.1. Запуск процесса

Запуск процесса hetao с использованием команды hetao и указанием пути к файлу конфигурации ~/etc/hetao.conf:

$ hetao ~/etc/hetao.conf

Просмотр процессов с помощью команд ps -ef | grep hetao | grep -v grep:

calvin   14876     1  0 00:10 ?  00:00:00 hetao /home/calvin/etc/hetao.conf
calvin   14877 14876  0 00:10 ?  00:000:00 hetao /home/calvin/etc/hetao.conf

Остановка процесса с помощью сигналов USR2 и SIGKILL:

kill -USR2 14876
ps -ef | grep hetao | grep -v grep

Вывод информации о процессах:

calvin   14876     1  0 00:10 ?   00:00:00 hetao /home/calvin/etc/hetao.conf
calvin   14877 14876  0 00:10 ?   00:00:00 hetao /home/calvin/etc/hetao.conf
kill 14876
ps -ef | grep hetao | grep -v grep

Информация о процессах остаётся прежней.

Повторный запуск процесса:

kill -USR1 14889

Завершение процесса с помощью сигнала SIGTERM:

kill 14889

5.2. Управление через скрипт hetao.do

Запуск процесса с помощью команды hetao.do start:

hetao.do start
hetao start ok

Отображение информации о процессе с помощью команды hetao.do status:

hetao.do status

Перезапуск процесса с помощью команды hetao.do restart:

hetao.do restart

Останов процесса с помощью команды hetao.do stop:

hetao.do stop

Плавное завершение процесса с помощью команды hetao.do graceful:

hetao.do graceful

Рестарт процесса с плавным завершением старого процесса и запуском нового с помощью команды hetao.do graceful_restart:

hetao.do graceful_restart

Перенаправление логов с помощью команды hetao.do relog:

hetao.do relog

В тексте запроса есть код на языке программирования, но он не переведён. Linux

$ minihetao /var/hetao/www

WINDOWS

minihetao.png

wwwroot — папка

Running — работает

Stop — остановлен

Registe folder popup-menu — зарегистрировать всплывающее меню папки

Unregiste folder popup-menu — отменить регистрацию всплывающего меню папки

Hide — скрыть

Exit — выйти

ע�⣺WINDOWS minihetao — не удалось перевести

6. SOCGI

6.1. SOCGI функции

Функция Описание Аргументы Возвращаемое значение
InitHttpApplication Инициализация HTTP-приложения Web-контекст HTTP_OK или hetao
CleanHttpApplication Очистка HTTP-приложения Веб-контекст 0

6.1.1. Функции HTTP-приложений

Функция Описание
InitHttpApplication Инициализирует HTTP-приложение
CleanHttpApplication Очищает HTTP-приложение

6.1.2. HTTP-функции

HTTP-функции используются для обработки запросов и ответов.

Функция Описание
RedirectHttpDomain Перенаправляет HTTP-запрос на другой домен
RewriteHttpUri Переписывает HTTP-URI
BeforeProcessHttpResource Выполняет действия перед обработкой HTTP-ресурса
ProcessHttpResource Обрабатывает HTTP-ресурс
SelectForwardServer Выбирает сервер для пересылки запроса
CallHttpApplication Вызывает HTTP-приложение
GetHttpResource Получает HTTP-ресурс
AfterProcessHttpResource Выполняет действия после обработки HTTP-ресурса

HTTP функции используются для управления запросами и ответами.

һ���򵥵Ĵ���ģ�����£�

#include "hetao_socgi.h"

INITHTTPAPPLICATION InitHttpApplication ;
int InitHttpApplication( struct HttpApplicationContext *ctx )
{
    ...
    
    return 0;
}

CALLHTTPAPPLICATION CallHttpApplication ;
int CallHttpApplication( struct HttpApplicationContext *ctx )
{
    ...
    
    return 0;
}

CLEANHTTPAPPLICATION CleanHttpApplication ;
int CleanHttpApplication( struct HttpApplicationContext *ctx )
{
    ...
    
    return 0;
}

hetao SOCGI — не удалось определить, что это такое.

Файлы hetao_socgi.[lib,dll] и hetao_util.[lib,dll] используются в Windows.

Тестирование проводится с помощью файла test_socgi_hello.c. Текст запроса на русском языке:

char    buf[...] ;
int buf_len ;
int count ;
...
BUFPRINTF( buf , buf_len , "count[%d]" , count )

Описание:

Здесь объявляется функция BUFPRINTF, которая принимает три аргумента: буфер (buf), размер буфера (buf_len) и строку формата («count[%d]»), содержащую спецификатор формата «%d». Функция BUFPRINTF выполняет форматирование и запись отформатированной строки в буфер.

char    buf[...] ;
int buf_len ;
...
BUFNSTRCAT( buf , sizeof(buf) , buf_len , "ok" )

Описание:

Объявляется функция BUFNSTRCAT, принимающая четыре аргумента: буфер (buf), его размер (sizeof(buf)), размер второго буфера (buf_len), и добавляемую строку («ok»). Функция объединяет два буфера и добавляет строку.

char    buf[...] ;
int buf_len ;
...
BUFSTRCAT( buf , buf_len , "ok" )

Описание:

Функция BUFSTRCAT объединяет буфер с самим собой и добавляет строку «ok».

Далее в тексте идёт описание функций API, связанных с HTTP-запросами. В запросе нет подробного описания этих функций, поэтому перевод может быть неполным или неточным. Вот перевод некоторых фрагментов:

struct HttpApplicationContext *ctx :  HTTP���������Ļ���<br />char *http_response_body : HTTP��Ӧ��<br />int http_response_body_len : HTTP��Ӧ�峤��<br />char *http_header_format , ... : HTTP��Ӧͷ������ж��еĻ���Ҫ��"\r\n"�ָ�
  • Описание: В этом фрагменте описывается структура данных HttpApplicationContext, содержащая указатель на контекст приложения (ctx), тело ответа HTTP (http_response_body), длину тела ответа (http_response_body_len) и формат заголовка HTTP (http_header_format).
HTTP���󷽷�
  • Описание: Это значение может относиться к чему-то связанному с HTTP. Однако без контекста сложно понять, что именно имеется в виду.
HTTP������URI
  • Описание: Возможно, это значение связано с URI в контексте HTTP.
HTTP������汾��
  • Описание: Вероятно, это относится к версии HTTP.
HTTP������ͷѡ��
  • Описание: Может быть связано с заголовком HTTP.
HTTP������ͷѡ���
  • Описание: Также может иметь отношение к заголовку HTTP. 6.2.2.2.7. SOCGIGetHttpHeaderValuePtr
Функция Описание
char *SOCGIGetHttpHeaderValuePtr( struct HttpHeader *p_header , int *p_value_len ) HTTP-заголовок
struct HttpHeader *p_header : HTTP-заголовок Указатель на структуру HTTP-заголовка
int *p_name_len : длина имени Указатель на длину имени заголовка

6.2.2.2.8. SOCGIGetHttpBodyPtr

Функция Описание
char *SOCGIGetHttpBodyPtr( struct HttpApplicationContext *ctx , int *p_body_len ) Тело HTTP-запроса
struct HttpHeader *p_header : HTTP������ͷѡ�� Указатель на HTTP-заголовок
int *p_body_len : тело запроса Указатель на размер тела запроса

6.2.2.3. Функции

6.2.2.3.1. SOCGIGetConfigPathfilename

Функция Описание
char *SOCGIGetConfigPathfilename( struct HttpApplicationContext *ctx ) Путь к файлу конфигурации
struct HttpApplicationContext *ctx : HTTP���������Ļ��� Указатель на контекст приложения HTTP

6.2.2.3.2. SOCGISetUserData

Функция Описание
void SOCGISetUserData( struct HttpApplicationContext *ctx , void *user_data ) Установка пользовательских данных
struct HttpApplicationContext *ctx : HTTP������������
void *user_data : пользовательские данные
Указатель на контекст приложения HTTP и пользовательские данные соответственно

6.2.2.3.3. SOCGIGetUserData

Функция Описание
void *SOCGIGetUserData( struct HttpApplicationContext *ctx ) Получение пользовательских данных
struct HttpApplicationContext *ctx Указатель на контекст приложения HTTP

6.3. RESTful

hetao_socgi������������hetao_rest�㣬����ֱ�ӿ���RESTful���Ӧ�á������ӿ�ͷ�ļ���hetao_rest.h�У�ʾ��test/test_socgi_rest_hello/test_socgi_rest_hello.c��ʾ�˼򵥿�����

#include "hetao_rest.h"

#include "LOGC.h"

funcRestServiceEntry GET_hello ;
int GET_hello( struct RestServiceContext *ctx )
{
    char        http_body[ 1024 ] = "" ;
    int     http_body_len = 0 ;
    
    int     nret = 0 ;
    
    InfoLog( __FILE__ , __LINE__ , "GET_hello" );
    
    BUFSTRCAT( http_body , http_body_len , "hetao_rest : hello world\n" ) ;
    nret = RESTFormatHttpResponse( ctx , http_body , http_body_len , NULL ) ;
    if( nret )
    {
        ErrorLog( __FILE__ , __LINE__ , "RESTFormatHttpResponse failed[%d]" , nret );
        return nret;
    }
    else
    {
        InfoLog( __FILE__ , __LINE__ , "RESTFormatHttpResponse ok" );
        return 0;
    }
}

static struct RestServiceConfig     g_RSC_ARRAY[] = 
    {
        { HTTP_METHOD_GET , "/hello.do" , GET_hello } ,
        { "" , "" , NULL }
    } ;

INITHTTPAPPLICATION InitHttpApplication ;
int InitHttpApplication( struct HttpApplicationContext *ctx )
{
    struct RestServiceControler *ctl = NULL ;
    
    InfoLog( __FILE__ , __LINE__ , "InitHttpApplication" );
    
    ctl = RESTCreateRestServiceControler( g_RSC_ARRAY ) ;
    if( ctl == NULL )
    {
        ErrorLog( __FILE__ , __LINE__ , "RESTCreateRestServiceControler failed" );
        return REST_FATAL_CREATE_RESTSERVICECONTROLER;
    }
    else
    {
        DebugLog( __FILE__ , __LINE__ , "RESTCreateRestServiceControler ok" );
    }
    
    SOCGISetUserData( ctx , ctl );
    
    return 0;
}

CALLHTTPAPPLICATION CallHttpApplication ;
int CallHttpApplication( struct HttpApplicationContext *ctx )
{
    struct RestServiceControler *ctl = NULL ;
    
    int             nret = 0 ;
    
    InfoLog( __FILE__ , __LINE__ , "CallHttpApplication" );
    
    ctl = SOCGIGetUserData( ctx ) ;
    if( ctl == NULL )
    {
        ErrorLog( __FILE__ , __LINE__ , "SOCGIGetUserData failed" );
        return REST_FATAL_GET_RESTSERVICECONTROLER;
    }
    else
    {
        DebugLog( __FILE__ , __LINE__ , "SOCGIGetUserData ok" );
    }
    
    nret = RESTDispatchRestServiceControler( ctl , SOCGIGetHttpEnv(ctx) ) ;
    if( nret )
    {
        ErrorLog( __FILE__ , __LINE__ , "RESTDispatchRestServiceControler failed[%d]" , nret );
        return nret;
    }
    else

*В запросе присутствует код на языке C, который не был переведён.* **6.4. RESTful**

### 6.4.1. HTTP-методы
| Метод | Определение |
| --- | --- |
| GET    | #define HTTP_METHOD_GET    "GET" |
| POST   | #define HTTP_METHOD_POST   "POST" |
| HEAD   | #define HTTP_METHOD_HEAD   "HEAD" |
| TRACE  | #define HTTP_METHOD_TRACE  "TRACE" |
| OPTIONS| #define HTTP_METHOD_OPTIONS    "OPTIONS" |
| PUT    | #define HTTP_METHOD_PUT    "PUT" |
| DELETE | #define HTTP_METHOD_DELETE "DELETE" |

### 6.4.2. Функции
#### 6.4.2.1. Функции RESTful
##### 6.4.2.1.1. funcRestServiceEntry
| Функция | Описание |
| --- | --- |
| typedef int funcRestServiceEntry( struct RestServiceContext *ctx ); | RESTful — функция обратного вызова |
| struct RestServiceContext *ctx : RESTful-контекст |
| Возвращаемое значение: | 0 — ошибка <br /> 1 — успешное выполнение |

### 6.4.3. API
#### 6.4.3.1. RESTful API
##### 6.4.3.1.1. RESTCreateRestServiceControler
| Функция | Описание |
| ----------------------- | ----------------------------------------------------- |
| struct RestServiceControler *RESTCreateRestServiceControler( struct RestServiceConfig *config_array ); ) | Создание контроллера RESTful |
| struct RestServiceConfig *config_array : конфигурация RESTful, включая HTTP-метод, HTTP-URI и т. д. |
| Возвращаемое значение: struct RestServiceControler* — указатель на контроллер RESTful |

##### 6.4.3.1.2. RESTDispatchRestServiceControler
| Функция | Описание |
| ------------------------ | ---------------------------------------------------- |
| int RESTDispatchRestServiceController( struct RestServiceController *ctl, struct HttpEnv *http ); | Диспетчеризация контроллера RESTful |
| struct RestServiceController *ctl : Контроллер RESTful<br />struct HttpEnv *http : HTTP-среда |
| Возвращаемое значение: 0 — ошибка<br />1 — успешное выполнение |

##### 6.4.3.1.3. RESTDestroyRestServiceController
| Функция | Описание |
| ----------- | -------------- |
| void RESTDestroyRestServiceController( struct RestServiceController *ctl ); | Уничтожение контроллера RESTful |
| struct RestServiceController *ctl: Контроллер RESTful |
| Возвращаемого значения нет |

#### 6.4.3.2. Операции RESTful
##### 6.4.3.2.1. RESTGetHttpMethodPtr
| Функция | Описание |
| --------- | ------------ |
| char *RESTGetHttpMethodPtr( struct RestServiceContext *ctx, int *p_http_method_len ); | Получение указателя на HTTP-метод |
| struct RestServiceContext *ctx: RESTful-контекст<br />int *p_method_len: длина метода |
| Возвращаемое значение: указатель на метод |

##### 6.4.3.2.2. RESTGetHttpUriPtr
| Функция | Описание |
| -------- | ----------- |
| char *RESTGetHttpUriPtr( struct RestServiceContext *ctx, int *p_http_uri_len ); | Получение указателя на URI HTTP |
| struct RestServiceContext *ctx: RESTful-контекст<br />int *p_method_len: длина URI |
| Возвращаемое значение: указатель на URI |

##### 6.4.3.2.3. RESTGetHttpUriPathsCount
| Функция | Описание |
| ---------- | --------------- |
| int RESTGetHttpUriPathsCount( struct RestServiceContext *ctx); | Получение количества путей URI |
| struct RestServiceContext *ctx: RESTful-контекст |
| Возвращаемое значение: количество путей |

##### 6.4.3.2.4. RESTGetHttpUriPathPtr
| Функция | Описание |
| ------------- | ------------------ |
| char *RESTGetHttpUriPathPtr( struct RestServiceContext *ctx, int index, int *p_path_len ); | Получение указателя на путь URI по индексу |
| struct RestServiceContext *ctx: RESTful-контекст<br />int index: индекс пути<br />int *p_path_len: длина пути |
| Возвращаемое значение: указатель на путь |

##### 6.4.3.2.5. RESTGetHttpUriQueriesCount
| Функция | Описание |
| ------- | ------- |
| int RESTGetHttpUriQueriesCount( struct RestServiceContext *ctx ); | Получение количества запросов в URI |
| struct RestServiceContext *ctx: RESTful-контекст |
| Возвращаемое значение: количество запросов | 7.1.3. Текст

Текст на неизвестном языке:
> hetao/0.2.0 && hetao/0.7.0
> Nginx/1.9.13
> Apache/2.2.14
> Tengine/2.1.2

...

g++ -I../module/access -I../module/whm -O2 -g -DNDEBUG  -D_REENTRANT -DLINUX -D_LARGE_FILE -D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64 -L../lib   -o kangle cache.o KConfig.o forwin32.o garbage_c.o HttpCore.o KAccess.o KAcserver.o KAcserverManager.o KBuffer.o KChain.o KConfigBuilder.o KConfigParser.o KContentType.o KDiskCache.o KPortSelector.o KKqueueSelector.o KEpollSelector.o KFastcgiFetchObject.o KFastcgiUtils.o KFetchObject.o KFileMsg.o KFileName.o KHtmlSupport.o KHtmlSupportException.o KHttpKeyValue.o KHttpManage.o KHttpObject.o KHttpObjectHash.o KHttpObjectParserHook.o KHttpProtocolParser.o KHttpProtocolParserHook.o KHttpProxyFetchObject.o KHttpRequest.o KHttpServerParser.o KLang.o KLangParser.o KLogElement.o KReg.o KSelector.o KSelectorManager.o KSequence.o KServerListen.o KSocket.o KSocketFetchObject.o KTable.o KThreadPool.o KTimeMatch.o KUrlValue.o KVirtualHost.o KVirtualHostManage.o KWriteBack.o KWriteBackManager.o KXmlContext.o KXml.o KXmlException.o KXmlSupport.o lib.o log.o main.o malloc_debug.o md5.o work.o utils.o KAccessParser.o KString.o KRewriteMark.o KSingleProgram.o KHttpTransfer.o KDeChunked.o KGzip.o KServer.o KSelectable.o KStream.o KNsVirtualHost.o KContentMark.o KRedirectMark.o KLineFile.o KMultiHostAcl.o test.o KHttpFieldValue.o KSingleAcserver.o KMultiAcserver.o KSockPoolHelper.o KEnvInterface.o KRedirect.o KCgiRedirect.o KCgiFetchObject.o KPipeStream.o KCgi.o KCgiEnv.o KApiRedirect.o KApiEnv.o HttpExt.o KApiFetchObject.o KHttpHeadPull.o KSockFastcgiFetchObject.o KApiFastcgiFetchObject.o KPathRedirect.o KLogManage.o KBaseVirtualHost.o process.o KContentTransfer.o KChunked.o KCacheStream.o KHttpField.o KHttpDigestAuth.o KHttpAuth.o KHttpBasicAuth.o KAuthMark.o KObjectList.o KAjpMessage.o KAjpFetchObject.o KExpressionParseTree.o KSSICommandCondition.o KSSICommandEcho.o KSSICommandInclude.o KSSIContext.o KSSIRedirect.o KSSICommandSet.o KSSIProcess.o KSSICommand.o KSSICommandPrintEnv.o KSSIFetchObject.o KServiceProvider.o KISAPIServiceProvider.o directory.o KSSICommandExec.o KSSICommandConfig.o ssl_utils.o KApiPipeStream.o KPoolableSocketContainer.o KProcessManage.o KCmdPoolableRedirect.o KSubVirtualHost.o KIpVirtualHost.o KHttpPost.o KHtAccess.o KHtModule.o KHtRewriteModule.o KRewriteMarkEx.o EdcodeUtils.o KProcess.o KApiProcess.o KCmdProcess.o KVirtualHostProcess.o KExtendProgram.o KDynamicString.o kmysql.o KCdnMysqlMark.o KCdnRewriteMark.o KCdnContainer.o KTempleteVirtualHost.o KVirtualHostDatabase.o KDsoModule.o KList.o KListNode.o KLogHandle.o KRequestQueue.o KContext.o KCdnRedirect.o time_utils.o rbtree.o KVirtualHostContainer.o KSocketBuffer.o KAsyncFetchObject.o KSyncFetchObject.o KStaticFetchObject.o KDirectoryFetchObject.o KApiDso.o KUwsgiFetchObject.o KScgiFetchObject.o KHmuxFetchObject.o KTempFile.o KListenConfigParser.o KApacheVirtualHost.o KSSLSocket.o KAsyncWorker.o KInputFilter.o KMultiPartInputFilter.o KReplaceContentMark.o KReplaceContentFilter.o KConcatFetchObject.o KIpSpeedLimitMark.o KDynamicListen.o KCache.o KPerIpAcl.o KDiskCacheIndex.o KSqliteDiskCacheIndex.o ../module/whm/dllmain.o ../module/whm/WhmCallMap.o ../module/whm/WhmCommand.o ../module/whm/WhmContext.o ../module/whm/whm.o ../module/whm/WhmLog.o ../module/whm/WhmPackage.o ../module/whm/WhmPackageManage.o ../module/whm/KWhmService.o ../module/whm/stdafx.o ../module/whm/WhmDso.o ../module/whm/WhmExtend.o ../module/whm/WhmUrl.o ../module/whm/WhmShell.o ../module/whm/WhmShellProcess.o ../module/whm/WhmShellSession.o ../module/whm/whmdso/core/core.o KTimer.o KUrlParser.o KHttpFilterContext.o KHttpFilterDso. **Document Length:** 293 байта.

**Concurrency Level:** 1000.

Время, затраченное на тесты: 23,928 секунды.

Всего выполнено запросов: 100 000.

Неудачных запросов: 0.

Ошибок записи: 0.

Запросов Keep-Alive: 99 004.

Общий объём переданных данных: 54 195 020 байт.

Объём переданного HTML: 29 300 000 байт.

Количество запросов в секунду: 4179,19 [#/сек] (среднее значение).

Время на запрос: 239,281 [мс] (среднее значение).

Время на запрос: 0,239 [мс] (среднее значение для всех одновременных запросов).

Скорость передачи данных: 2211,83 [Кбайт/сек] получено.

*Времена соединения (мс)*
| | min | mean[+/-sd] | median | max |
|:--:|:---:|:----------:|:------:|:----:|
| Connect | 0 | 23 268,2 | 0 | 3167 |
| Processing | 1 | 127 904,6 | 75 | 20671 |
| Waiting | 0 | 127 904,6 | 75 | 20670 |
| Total | 1 | 150 1058,7 | 75 | 23814 |

Процент запросов, выполненных за определённое время (мс)
| 50% | 66% | 75% | 80% | 90% | 95% | 98% | 99% | 100% |
|:---|:----:|:-----:|:-----:|:----:|:----:|:----:|:----:|:--------:|
| 75  | 86  | 87  | 87  | 92  | 96  | 96  | 2365 | 23814 (самый длинный запрос) |

$ ab2 -kc 1000 -n 50000 -H "Accept-Encoding: gzip" http://192.168.6.111:9529/press.html
Это ApacheBench, версия 2.3 <$Revision: 655654 $>
Авторские права 1996 года Адам Твисс, Zeus Technology Ltd, http://www.zeustech.net/
Лицензия предоставлена The Apache Software Foundation, http://www.apache.org/

Тестирование производительности 192.168.6.111 (будьте терпеливы)
Завершено 10 000 запросов
Завершено 20 000 запросов
Завершено 30 000 запросов
Завершён 40 000 запросов
Завершено 50 000 запросов
Завершено 60 000 запросов
Завершено 70 000 запросов
Завершено 80 000 запросов
Завершено 90 000 запросов
Завершено 100 000 запросов
Закончено 100 000 запросов


Программное обеспечение сервера: Apache/2.2.14
Имя хоста сервера: 192.168.6.111
Порт сервера: 9529

Путь к документу: /press.html
Длина документа: 281 байт

Уровень параллелизма: 1000
Время, затраченное на тестирование: 39,800 секунд
Всего запросов: 100 000
Неудачные запросы: 0
Ошибки записи: 0
Запросы Keep-Alive: 99119
Общий объём передаваемых данных: 65 363 814 байт
Передано HTML: 28 101 124 байта
Количество запросов в секунду: 2512,58 [#/сек] (в среднем)
Время на запрос: 397,998 [мс] (в среднем)
Время на запрос: 0,398 [мс] (в среднем для всех одновременных запросов)
Скорость передачи: 1603,83 [Кбайт/сек] получена

Времена соединений (мс)
| | min | mean[+/-sd] | median | max |
|:--:|:---:|:----------:|:------:|:----:|
| Connect | 0 | 1 48,4 | 0 | 3001 |
| Processing | 1 | 97 774,0 | 2 | 25875 |
| Waiting | 0 | 97 773,8 | 2 | 25875 |
| Всего | 1 | 98 780,3 | 2 | 25897 |

Процент запросов, обслуженных за определённое время (мс)
| 50% | 66% | 75% | 80% | 90% | 95% | 98% | 99% | 100% |
|:---|:----:|:-----:|:-----:|:----:|:----:|:----:|:----:|:--------:|
| 2   | 3   | 3    | 4    | 6    | 82   | 1398 | 2352 | 25897 (самый длинный запрос) |

$ ab2 -kc 1000 -n 50000 -H "Accept-Encoding: gzip" http://192.168.6.111:9530/press.html
Это ApacheBench, версия 2.3 <$Revision: 655654 $>
Авторские права 1996 года Адам Твисс, Zeus Technology Ltd, http://www.zeustech.net/
Лицензия предоставлена The Apache Software Foundation, http://www.apache.org/

Тестирование производительности 192.168.6.111 (будьте терпеливы)
Завершено 10 000 запросов
Завершено 20 000 запросов
Завершено 30 000 запросов
Завершён 40 000 запросов
Завершено 50 000 запросов
Завершено 60 000 запросов
Завершено 70 000 запросов
Завершено 80 000 запросов
Завершено 90 000 запросов
Завершено 100 000 запросов
Закончено 100 000 запросов


Программное обеспечение сервера: Tengine/2.1.2
Имя хоста сервера: 192.168.6.111
Порт сервера: 9530

Путь к документу: /press.html
Длина документа: 293 байт

Уровень параллелизма: 1000
Время, затраченное на тестирование: 25,203 секунды
Всего запросов: 100 000
Неудачные запросы: 0
Ошибки записи: 0
Запросы Keep-Alive: 99027
Общий объём передаваемых данных: 51 895 135 байт
Передано HTML: 29 300 000 байт
Количество запросов в секунду: 3967,81 [#/сек] (в среднем)
Время на запрос: 252,028 [мс] (в среднем)
Время на запрос: 0,252 [мс] (в среднем для всех одновременных запросов)
Скорость передачи: 2010,84 [Кбайт/сек] получена

Времена соединений (мс)
| | min | mean[+/-sd] | median | max |
|:--:|:---:|:----------:|:------:|:----:|
| Connect | 0 | 16 233,6 | 0 | 21003 |
| Processing | 1 | 91 485,5 | 33 | 21267 |
| Waiting | 1 | 91 485,5 | | **Процент запросов, обслуженных за определённое время (мс)**

50% — 33.
66% — 101.
75% — 112.
80% — 112.
90% — 132.
95% — 182.
98% — 213.
99% — 337.
100% — 24392 (самый длинный запрос).

**Таблица: запросы в секунду**
| ROUND | hetao/0.2.0 | nginx/1.9.13 | Apache/2.2.14 | Tengine/2.1.2 |
| --- | --- | --- | --- | --- |
| 1 | 13191,46 | 4208,08 | 2472,8 | 4282,31 |
| 2 | 14237,18 | 4395,69 | 2466,09 | 4013,62 |
| 3 | 14650,89 | 4245,99 | 2471,7 | 4346,52 |
| 4 | 16023,53 | 4234,76 | 2454,81 | 4152,04 |
| 5 | 14409,31 | 4206,19 | 2469,85 | 4381,55 |
| 6 | 15535,74 | 4184,32 | 2458,29 | 4013,12 |
| 7 | 14893,44 | 4110,75 | 2471,7 | 4313,44 |
| 8 | 14581,95 | 4406,23 | 2467,72 | 4014,66 |
| 9 | 14572,83 | 4171,1 | 2481,25 | 4250,61 |
| 10 | 13868,79 | 4100,61 | 2479,77 | 4209,85 |

**Рисунок: сравнение производительности hetao 0.2.0, nginx 1.9.13, Apache 2.2.14 и Tengine 2.1.2**

| ROUND | hetao/0.7.0 | nginx/1.9.13 | Apache/2.2.14 | Tengine/2.1.2 |
| --- | --- | --- | --- | --- |
| 1 | 14661,97 | 4207,47 | 2498,64 | 4129,57 |
| 2 | 14751,86 | 4026,66 | 2474,3 | 4077,7 |
| 3 | 15424,81 | 4228,18 | 2482,39 | 4163,84 |
| 4 | 15393,55 | 4407,28 | 2477,92 | 4256,37 |
| 5 | 16013,01 | 4174,62 | 2480,06 | 3951,33 |
| 6 | 13500,85 | 4229,33 | 2474,44 | 4257,32 |
| 7 | 16960,94 | 4115,91 | 2480,42 | 4034,18 |
| 8 | 15429,98 | 4198,95 | 2475,3 | 3966,88 |
| 9 | 14829,60 | 4108,92 | 2483,37 | 4289,45 |
| 10 | 14901,13 | 4377,75 | 2485,03 | 3969,52 |

**Рисунок: сравнение производительности hetao 0.7.0, nginx 1.9.13, Apache 2.2.14 и Tengine 2.1.2**

* * *

В тексте запроса содержится информация о производительности различных серверов и их компонентов. Также обсуждаются вопросы проектирования веб-серверов и приводятся примеры кода на разных языках программирования. Однако в запросе нет вопросов или задач, требующих перевода.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Высокопроизводительный, полнофункциональный отечественный оригинальный веб-сервер с поддержкой размещения приложений. Развернуть Свернуть
C и 6 других языков
LGPL-2.1
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/calvinwilliams-hetao.git
git@api.gitlife.ru:oschina-mirror/calvinwilliams-hetao.git
oschina-mirror
calvinwilliams-hetao
calvinwilliams-hetao
release