Разработка и тестирование программного обеспечения: 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. Тестирование программного обеспечения
5. Обслуживание системы
6. Расширение использования
6.1. SOCGI — расширение использования путём внедрения
6.2. SOCGI — использование расширения
6.3. RESTful — расширение использования путём внедрения
6.4. RESTful — использование расширения
6.4.1. Рабочие области
6.4.2. Функции API
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.3. ����RESTful��Ӧ��Ϣ��
6.4.3.4. ������
- **7.1. ѹ���**
- **7.1.1. ѹ��ƽ̨**
- **7.1.2. ѹ��ͻ���**
- **7.1.3. ѹ������**
—
- 7.2. ѹ�ⷽ��
—
- 7.3. ѹ�����
—
- 7.4. ѹ����
- **8.1. ���̺��߳̽ṹ**
—
- 8.2. �������ù�ϵͼ
- 8.2.1. �������ʼ��
- 8.2.2. ��������
- 8.2.3. ��������
—
Версия | Дата | Описание |
---|---|---|
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
}
},
Читаем файл 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» не переведены.
Проверка конфигурации с помощью команды 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]
Запуск процесса 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
Запуск процесса с помощью команды 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
wwwroot — папка
Running — работает
Stop — остановлен
Registe folder popup-menu — зарегистрировать всплывающее меню папки
Unregiste folder popup-menu — отменить регистрацию всплывающего меню папки
Hide — скрыть
Exit — выйти
ע�⣺WINDOWS minihetao — не удалось перевести
Функция | Описание | Аргументы | Возвращаемое значение |
---|---|---|---|
InitHttpApplication | Инициализация HTTP-приложения | Web-контекст | HTTP_OK или hetao |
CleanHttpApplication | Очистка HTTP-приложения | Веб-контекст | 0 |
Функция | Описание |
---|---|
InitHttpApplication | Инициализирует HTTP-приложение |
CleanHttpApplication | Очищает 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"�ָ�
HTTP����
HTTP������URI
HTTP������汾��
HTTP������ͷѡ��
HTTP������ͷѡ���
Функция | Описание |
---|---|
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.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 |
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 )