Начало работы с Nginx

Java Nginx

Уровень: ★★☆☆☆
Теги: "Nginx" "https" "Балансировщик нагрузки"
автор:Уйти с работы в девять
Обзор:Команда QiShare


1. Введение в Nginx

Nginxэто легкий веб-сервер. обычно используется вобратный прокси,балансировки нагрузкииHTTP-кеширование. В настоящее время многие известные интернет-компании мира используют Nginx.

обратный прокси и прямой прокси

Одной из функций Nginx является обратный прокси, так что же такое прямой прокси и обратный прокси? На Zhihu есть хорошее резюме ответа, и поместите его здесь.

Следующий контент от пользователей ZhihuМонитор и его шуринответ

Прямой прокси скрывает реального клиента, а обратный прокси скрывает настоящий сервер.

Следующий контент от пользователей ZhihuЛю Чжицзюньответ

Прокси, о котором мы часто говорим, это только прямой прокси, процесс прямого прокси, который скрывает реального клиента запроса, сервер не знает, кто настоящий клиент, и услуги, запрошенные клиентом, заменяются прокси-сервером на запрос, некоторые научные онлайн-инструменты играют роль типичного передового агента. Доступ через браузерwww.google.com, был жестоко заблокирован, так что вы можете построить прокси-сервер за границей, пусть прокси поможет мне запросить google.com, и прокси вернет мне соответствующую структуру, возвращенную запросом.

image.png

Обратный прокси скрывает настоящий сервер.Когда мы запрашиваем www.baidu.com, это все равно, что набирать 10086. Нас могут обслуживать тысячи серверов, но вы не знаете, какой именно. , вам просто нужно знать, кто является обратным прокси-сервером. www.baidu.com — это наш обратный прокси-сервер, и обратный прокси-сервер поможет нам перенаправить запрос на настоящий сервер. Nginx — это обратный прокси-сервер с очень хорошей производительностью, который используется для балансировки нагрузки.

Разница между ними заключается в том, что объекты прокси-сервера разные: объект прямого прокси-сервера — это клиент, а объект обратного прокси-сервера — сервер.

image.png

Основываясь на вышеприведенном понимании, мы видим, что 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, если появится следующая страница, конфигурация выполнена успешно и доступ нормальный.

image.png

3. Настоящий бой

Теперь, когда мы установили и настроили Nginx, давайте взглянем наобратный проксиКак Nginx используется в этом сценарии. Сначала давайте создадим веб-сервис с помощью SpringBoot.

существуетstart.spring.ioИнициализация проекта нам удобна для тестирования.

image.png

Откройте вновь инициализированный проект с помощью Eclipse или InteliJ IDEA.Каталог всего проекта выглядит следующим образом.

image.png

существует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

image.png

tomcat прослушивает порт 9090

image.png

обратный прокси

  • соответствие правил

Давайте сначала посмотрим на соответствие правил доступа, упомянутых выше, и добавим следующее местоположение в блок сервера.

    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Доступ закрыт.

image.png

/hi/nginxеще доступен.

image.png

  • Обратный прокси с использованием номера порта
#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.

image.png
Получите доступ к порту 9001 через Nginx, вы увидите, что возвращается содержимое порта 9090 tomcat.
image.png

Цель этого заключается в том, что в реальной серверной среде мы не можем открыть все порты, такие как порт 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 может быть возвращено нормально.

image.png

Доступ в браузереhttp://hi.democome.local/hello/nginxВы можете видеть, что содержимое порта 9090 может быть возвращено нормально.

image.png

Благодаря вышеуказанным тестам наша конфигурация действительна.

Если вы не хотите использовать порт 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;
    }
}

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

image.png

  • Прокси на другие сайты
server {
    listen       80;
    server_name  hi.democome.local;

    location / {
        proxy_pass        https://www.so.com/;
    }
}

Мы изменили блок сервера на следующую конфигурацию, а затем перезагрузили конфигурацию Nginx, мы можем обнаружить, что, хотя мы обращаемсяhi.democome.localНо страница, которая фактически возвращается, является страницей поиска 360, и доменное имя не меняется.

image.png

балансировки нагрузки

Говоря о балансировке нагрузки, то что такое балансировка нагрузки, давайте сначала посмотрим на определение из Википедии

Балансировка нагрузки — это компьютерный метод, используемый для распределения нагрузки между несколькими компьютерами (компьютерными кластерами), сетевыми соединениями, ЦП, дисками или другими ресурсами для оптимизации использования ресурсов, увеличения пропускной способности, сведения к минимуму оптимизации времени отклика и предотвращения перегрузки. Использование нескольких серверных компонентов с балансировкой нагрузки вместо одного компонента может повысить надежность за счет избыточности. Услуги балансировки нагрузки обычно выполняются с помощью специального программного и аппаратного обеспечения. Основная функция состоит в том, чтобы разумно распределять большое количество заданий по нескольким операционным блокам для выполнения, что используется для решения проблем высокой параллелизма и высокой доступности в архитектуре Интернета.

Подводя итог, балансировка нагрузки предназначена для решения проблемы высокого параллелизма. Если у нас есть несколько серверов, мы запускаем одно и то же приложение на каждом сервере.Когда пользователь обращается, мы надеемся, что 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.

image.png

Как показано на рисунке ниже, этот запрос исходит от 62.234.66.219.

image.png

Через несколько запросов мы обнаружили, что соотношение переадресации на каждый сервер в основном составляет 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 поддерживает жизнь
Еженедельник странных танцев