Уровень: ★★☆☆☆
Теги: "Nginx" "https" "Балансировщик нагрузки"
автор:Уйти с работы в девять
Обзор:Команда QiShare
1. Введение в Nginx
Nginxэто легкий веб-сервер. обычно используется вобратный прокси,балансировки нагрузкииHTTP-кеширование. В настоящее время многие известные интернет-компании мира используют Nginx.
обратный прокси и прямой прокси
Одной из функций Nginx является обратный прокси, так что же такое прямой прокси и обратный прокси? На Zhihu есть хорошее резюме ответа, и поместите его здесь.
Следующий контент от пользователей ZhihuМонитор и его шуринответ
Прямой прокси скрывает реального клиента, а обратный прокси скрывает настоящий сервер.
Следующий контент от пользователей ZhihuЛю Чжицзюньответ
Прокси, о котором мы часто говорим, это только прямой прокси, процесс прямого прокси, который скрывает реального клиента запроса, сервер не знает, кто настоящий клиент, и услуги, запрошенные клиентом, заменяются прокси-сервером на запрос, некоторые научные онлайн-инструменты играют роль типичного передового агента. Доступ через браузерwww.google.com, был жестоко заблокирован, так что вы можете построить прокси-сервер за границей, пусть прокси поможет мне запросить google.com, и прокси вернет мне соответствующую структуру, возвращенную запросом.
Обратный прокси скрывает настоящий сервер.Когда мы запрашиваем www.baidu.com, это все равно, что набирать 10086. Нас могут обслуживать тысячи серверов, но вы не знаете, какой именно. , вам просто нужно знать, кто является обратным прокси-сервером. www.baidu.com — это наш обратный прокси-сервер, и обратный прокси-сервер поможет нам перенаправить запрос на настоящий сервер. Nginx — это обратный прокси-сервер с очень хорошей производительностью, который используется для балансировки нагрузки.
Разница между ними заключается в том, что объекты прокси-сервера разные: объект прямого прокси-сервера — это клиент, а объект обратного прокси-сервера — сервер.
Основываясь на вышеприведенном понимании, мы видим, что Nginx играет очень важную роль в работе с веб-сайтами с высокими требованиями к параллелизму. Давайте посмотрим на установку и базовое использование Nginx в MacOS.
2. Базовое использование Nginx
Установка Nginx
Мы используем homebrew для установки Nginx
- Поиск Nginx
brew search nginx
- Установите Nginx
brew install nginx
Если нужно обновить доморощенный, этот процесс будет медленным, просто терпеливо подождите. После завершения установки появится следующее приглашение:
Docroot is: /usr/local/var/www
The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.
nginx will load all files in /usr/local/etc/nginx/servers/.
To have launchd start nginx now and restart at login:
brew services start nginx
Or, if you don't want/need a background service you can just run:
nginx
==> Summary
🍺 /usr/local/Cellar/nginx/1.17.8: 25 files, 2MB
==> `brew cleanup` has not been run in 30 days, running now...
Removing: /usr/local/Cellar/pcre/8.43... (204 files, 5.5MB)
Pruned 1 symbolic links and 1 directories from /usr/local
==> Caveats
==> nginx
Docroot is: /usr/local/var/www
The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.
nginx will load all files in /usr/local/etc/nginx/servers/.
To have launchd start nginx now and restart at login:
brew services start nginx
Or, if you don't want/need a background service you can just run:
nginx
- Просмотр информации Nginx
brew info nginx
Подсказка после этой команды и установки в основном соответствует, а базовая информация о конфигурации NGINX будет отображаться.
- Удалить Nginx
brew uninstall Nginx
Обратите внимание, что эта команда удалит только само программное обеспечение Nginx и не удалит файлы конфигурации. Если мы хотим полностью удалить Nginx, нам нужно удалить его вручную/usr/local/var/www
и/usr/local/etc/nginx/
файл ниже.
- Проверить версию Nginx
nginx -v
Моя локальная версия Nginx выглядит следующим образом
nginx version: nginx/1.17.8
- Проверьте, нормальная ли конфигурация Nginx
nginx -t
Если это нормально, мы получим следующий вывод:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
- конфигурационный файл
cat /usr/local/etc/nginx/nginx.conf
Приведенная выше команда может выводитьnginx.conf
Конфигурация в состоянии по умолчанию, я добавил комментарии в ключевых местах.
#user nobody;
worker_processes 1;
#(1)进程数
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#(2)错误日志位置 Mac上在/usr/local/var/log/nginx/
#pid logs/nginx.pid;
events {
worker_connections 1024;
#(3)最大连接数
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#(4)日志格式
#access_log logs/access.log main;
#(5)访问日志位置 Mac上在/usr/local/var/log/nginx/
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
#(6)第一种情况 拒绝访问ip地址段为 50-100 的ip访问
deny 192.168.10.50/100;
# 第二种情况 只允许ip地址为 192.168.10.50 的ip访问
allow 192.168.10.50;
deny all;
# 第三种情况 这样配置都不能访问,从上到下依次匹配
deny all;
allow 192.168.10.50;
}
#(7)精确匹配 /test 路径拒绝访问
location =/test {
deny all;
}
#(8)精确匹配 /test2 路径都可以访问
location =/test2 {
allow all;
}
#(9)精确匹配 已 php 结尾拒绝访问
location ~ \.php$ { # 正则匹配
deny all;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
include servers/*;
#(10)其他配置文件
}
- Запустить Nginx
cd /usr/local/Cellar/nginx/1.17.8/bin
./nginx
- перезагрузить файл конфигурации
./nginx -s reload
Выполнить после запускаps -ef|grep nginx
, если появится следующий журнал, доступ выполнен успешно.
501 65101 1 0 8:59下午 ?? 0:00.00 nginx: master process ./nginx
501 65102 65101 0 8:59下午 ?? 0:00.00 nginx: worker process
501 65173 63026 0 9:00下午 ttys001 0:00.00 grep nginx
доступhttp://localhost:8080
, если появится следующая страница, конфигурация выполнена успешно и доступ нормальный.
3. Настоящий бой
Теперь, когда мы установили и настроили Nginx, давайте взглянем наобратный проксиКак Nginx используется в этом сценарии. Сначала давайте создадим веб-сервис с помощью SpringBoot.
существуетstart.spring.ioИнициализация проекта нам удобна для тестирования.
Откройте вновь инициализированный проект с помощью Eclipse или InteliJ IDEA.Каталог всего проекта выглядит следующим образом.
существуетNginxTestController
Напишите два простых интерфейса на/hello/nginx
и/hi/nginx
, и верните, какой порт прослушивает текущая программа в ответе интерфейса.serverPort
.
@RestController
public class NginxTestController {
@Value("${server.port}")
private int serverPort;
@RequestMapping(value = "/hello/nginx", method = RequestMethod.GET)
public TestResponse getNginx() throws Exception {
TestResponse response = new TestResponse();
response.setCode(200);
response.setMessage("success");
response.setName("hello nginx");
response.setServerPort(serverPort);
return response;
}
@RequestMapping(value = "/hi/nginx", method = RequestMethod.GET)
public TestResponse getIncome() throws Exception {
TestResponse response = new TestResponse();
response.setCode(200);
response.setMessage("success");
response.setName("hi nginx");
response.setServerPort(serverPort);
return response;
}
}
существуетapplication.properties
Добавьте порт прослушивания в файл конфигурации.
server.port=8090
server.port=9090
Используйте maven для упаковки пакетов jar двух веб-служб, прослушивающих порты 8090 и 9090, какnginxdemo-SNAPSHOT-8090.jar
иnginxdemo-SNAPSHOT-9090.jar
Запустить два сервера отдельно
启动第一个 server
java -jar nginxdemo-SNAPSHOT-8090.jar
启动第二个 server
java -jar nginxdemo-SNAPSHOT-9090.jar
В случае, если Nginx не используется в качестве обратного прокси-сервера, мы сначала обращаемся к интерфейсам следующих двух серверов, чтобы увидеть, можно ли их использовать в обычном режиме, как показано на следующем рисунке.
tomcat прослушивает порт 8090
tomcat прослушивает порт 9090
обратный прокси
- соответствие правил
Давайте сначала посмотрим на соответствие правил доступа, упомянутых выше, и добавим следующее местоположение в блок сервера.
location =/hello/nginx {
deny all;
}
Полная конфигурация блока сервера выглядит следующим образом, после завершения модификации перезагрузите конфигурацию Nginx.
server {
listen 9000;
server_name localhost;
location / {
proxy_pass http://localhost:8090;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location =/hello/nginx {
deny all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
Из приведенной выше конфигурации вы можете/hello/nginx
Доступ запрещен, мы можем получить следующие результаты в доступе браузера:
/hello/nginx
Доступ закрыт.
/hi/nginx
еще доступен.
- Обратный прокси с использованием номера порта
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 9000;
server_name localhost;
location / {
proxy_pass http://localhost:8090;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 9001;
server_name localhost;
location / {
proxy_pass http://localhost:9090;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
include servers/*;
}
Использовать порты для обратного проксирования относительно просто: мы добавляем два блока server в файл конфигурации и позволяем Nginx прослушивать порты 9000 и 9001 соответственно. Затем прокси к порту 8090 и 9090 tomcat соответственно через proxy_pass в блоке местоположения.
Получите доступ к порту 9000 через Nginx, и вы увидите, что возвращается содержимое порта 8090 tomcat.
Получите доступ к порту 9001 через Nginx, вы увидите, что возвращается содержимое порта 9090 tomcat.Цель этого заключается в том, что в реальной серверной среде мы не можем открыть все порты, такие как порт 3306, обычно используемый mysql, поэтому возникнут большие проблемы с безопасностью, которые можно решить с помощью обратного прокси-сервера Nginx.
- Обратный прокси с использованием доменного имени
Выше упоминалось использование портов для обратного проксирования. В реальной среде разработки мы используем доменные имена или вторичные доменные имена для доступа к определенным страницам или интерфейсам. Обычно нам не нужно добавлять номер порта к доменному имени. Это связано с тем, что 80 является портом по умолчанию для протокола http. мы в гостяхhttp://baidu.com
при фактическом посещенииhttp://baidu.com:80
.
Итак, давайте посмотрим, как использовать Nginx в качестве обратного прокси через доменное имя. Поскольку я разрабатываю и тестирую локально, и у меня нет IP-адреса в общедоступной сети, как я могу преобразовать доменное имя в свой собственный IP-адрес в настоящее время? Мы можем изменить файл hosts.
127.0.0.1 hello.democome.local
127.0.0.1 hi.democome.local
Выше приведены две строки конфигурации, которые я добавил в файл hosts этой машины.Мы знаем, что нет доменного имени .local, но после добавления вышеуказанной конфигурации, когда я посещаюhello.democome.local
иhi.democome.local
, он будет разрешен на моем локальном компьютере, чтобы я мог использовать обратный прокси через Nginx, давайте посмотрим на конкретный файл конфигурации Nginx.
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name hello.democome.local;
location / {
proxy_pass http://localhost:8090;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name hi.democome.local;
location / {
proxy_pass http://localhost:9090;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
include servers/*;
}
В приведенной выше конфигурации мы изменили порты прослушивания в двух блоках серверов на 80, а затем два доменных имени второго уровня.hello.democome.local
иhi.democome.local
представлены отдельноhttp://localhost:8090
иhttp://localhost:9090
Два веб-сервера.
Доступ в браузереhttp://hello.democome.local/hello/nginx
Вы можете видеть, что содержимое порта 8090 может быть возвращено нормально.
Доступ в браузереhttp://hi.democome.local/hello/nginx
Вы можете видеть, что содержимое порта 9090 может быть возвращено нормально.
Благодаря вышеуказанным тестам наша конфигурация действительна.
Если вы не хотите использовать порт 80 по умолчанию, мы все равно можем использовать доменное имя плюс порт для доступа, конфигурация выглядит следующим образом:
server {
listen 9000;
server_name hello.democome.local;
location / {
proxy_pass http://localhost:8090;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
После изменения конфигурации и ее перезагрузки вы можете увидеть, что вы также можете получить к ней обычный доступ через доменное имя и порт.
- Прокси на другие сайты
server {
listen 80;
server_name hi.democome.local;
location / {
proxy_pass https://www.so.com/;
}
}
Мы изменили блок сервера на следующую конфигурацию, а затем перезагрузили конфигурацию Nginx, мы можем обнаружить, что, хотя мы обращаемсяhi.democome.local
Но страница, которая фактически возвращается, является страницей поиска 360, и доменное имя не меняется.
балансировки нагрузки
Говоря о балансировке нагрузки, то что такое балансировка нагрузки, давайте сначала посмотрим на определение из Википедии
Балансировка нагрузки — это компьютерный метод, используемый для распределения нагрузки между несколькими компьютерами (компьютерными кластерами), сетевыми соединениями, ЦП, дисками или другими ресурсами для оптимизации использования ресурсов, увеличения пропускной способности, сведения к минимуму оптимизации времени отклика и предотвращения перегрузки. Использование нескольких серверных компонентов с балансировкой нагрузки вместо одного компонента может повысить надежность за счет избыточности. Услуги балансировки нагрузки обычно выполняются с помощью специального программного и аппаратного обеспечения. Основная функция состоит в том, чтобы разумно распределять большое количество заданий по нескольким операционным блокам для выполнения, что используется для решения проблем высокой параллелизма и высокой доступности в архитектуре Интернета.
Подводя итог, балансировка нагрузки предназначена для решения проблемы высокого параллелизма. Если у нас есть несколько серверов, мы запускаем одно и то же приложение на каждом сервере.Когда пользователь обращается, мы надеемся, что Nginx перенаправит запрос пользователя на разные серверы в соответствии с определенной политикой, что решило проблему высокого давления доступа на один сервер проблема.
Чтобы проверить этот эффект, я сначала загрузил ранее упакованный файл jar на удаленный сервер и запустил его.
Давайте посмотрим, как его настроить:
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream localhost {
server 62.234.66.219:8090 weight=1; #远程服务器
server 192.168.0.101:8090 weight=3;
}
server {
listen 80;
server_name hello.democome.local;
location / {
add_header Backend-IP $upstream_addr;
proxy_pass http://localhost;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
include servers/*;
}
Основной из них — настройка восходящего блока, я настроил два сервера, из которых 62.234.66.219:8090 — это адрес сервера Tencent Cloud, а 192.168.0.101:8090 — ip-адрес моей локальной машины. Стратегия заключается в переадресации на два сервера в соответствии с пропорцией, соотношение 1:3. Есть также много правил о политиках, например, в соответствии с хешем ip и т. Д. Здесь мы только демонстрируем весовую стратегию.
upstream localhost {
server 62.234.66.219:8090 weight=1; #远程服务器
server 192.168.0.101:8090 weight=3;
}
Завершите вышеуказанное выполнение конфигурацииnginx -s reload
Перезагрузить конфигурацию. продолжать посещатьhttp://hello.democome.local/hello/nginx
.
Как показано ниже, этот запрос исходит от 192.168.0.101.
Как показано на рисунке ниже, этот запрос исходит от 62.234.66.219.
Через несколько запросов мы обнаружили, что соотношение переадресации на каждый сервер в основном составляет 1: 3. Вышеприведенное показывает, что настроенная нами стратегия балансировки нагрузки эффективна.
настройка https-сертификата
server {
listen 443 ssl;
server_name democome.com www.democome.com; #配置域名
ssl_certificate /etc/letsencrypt/live/democome.com/fullchain.pem; #配置证书位置
ssl_certificate_key /etc/letsencrypt/live/democome.com/privkey.pem; #配置证书位置
location /{ #反向代理配置
proxy_pass http://localhost:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Настройка сертификата относительно проста, сначала прослушайте порт 443, а затем выполните расположение сертификата.
больше рекомендаций
Бесплатное приложение для сертификата httpsletsencrypt.
Оригинальная ссылка:Уйти с работы в девять
Чтобы узнать больше об iOS и связанных с ней новых технологиях, обратите внимание на наш публичный аккаунт:
Вы можете добавить WeChat следующего редактора и отметить, что для присоединения к группе технического обмена QiShare редактор предложит вам присоединиться к «группе технического обмена QiShare».
Способы следовать за нами:
QiShare (короткая книга)
QiShare (Наггетс)
QiShare (знание)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare (общедоступная учетная запись WeChat)
рекомендуемая статья:
3D-трансформация в iOS (2)
3D-трансформация в iOS (1)
Двусторонняя практика WebSocket (iOS/Golang)
Сегодня поговорим о WebSocket (iOS/Golang)
Рисование кривой Безье с помощью Swift
Swift 5.1 (11) - Методы
Свифт 5.1 (10) - Свойства
Фон приложения iOS поддерживает жизнь
Еженедельник странных танцев