Проблемы с обратным прокси-сервером Nginx + ExpressJS + Angular + SSL - PullRequest
0 голосов
/ 17 декабря 2018

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

Если я правильно понял - nginx - это мой веб-сервер - запрос намой сервер готов и nginx обслуживает моего клиента (Angular), но могу ли я также использовать свое приложение Express для обслуживания его с res.sendFile()?И если я настрою nginx с обратным прокси, он будет работать как экземпляр между моим клиентом и бэкэндом?Таким образом, они не общаются друг с другом напрямую, а через nginx, и для этого мне необходимо proxy_pass мое приложение Express?

Мой доступный конфиг сайтов nginx:

# Default server configuration
#
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name blank-agency.org www.blank-agency.org;
    return 301 https://$server_name$request_uri;
} 


server {    
    # SSL configuration
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    ssl on;

ssl_certificate /etc/letsencrypt/live/blank-agency.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blank-agency.org/privkey.pem;

server_name blank-agency.org www.blank-agency.org;  
root /var/www/webserver/public/website;



    location ~ /.well-known {
            allow all;
    }


location / {

    proxy_pass https://localhost:3000;
             proxy_http_version 1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection 'upgrade';
             proxy_set_header Host $host;
             proxy_cache_bypass $http_upgrade;

}

Как выможно увидеть мою структуру каталогов:

/ var / www / webserver -> вот мой экспресс app.js

/ var / www / webserver / public / website -> вотмои угловые файлы dist

Если я использую nginx в качестве обратного прокси-сервера, мой клиент больше не обслуживается (bad gateway 502), поэтому я полагаю, что теперь мне нужно обслуживать его через приложение Express?

Итактеперь мой app.js:

// require section

var express = require('express'),
    mysql = require('mysql'),
    bodyParser = require('body-parser'),
    cors = require('cors'),
    path = require('path'),
    app = express();

// middlewares bodyParser + cors
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors());



var connection = mysql.createConnection({
    host: '127.0.0.1',
    user: 'root',
    password: 'whatever',
    database: 'whateverDB'
});

connection.connect();


app.use( express.static(__dirname + '/public/website'));

app.get('/', function(req, res){
    res.sendFile(path.join(__dirname + '/public/website/index.html'));
});

app.route('/customers').get((req, res) => {
   connection.query('SELECT * FROM customers', function (err, rows) {
      const results = JSON.stringify(rows);
      console.log(req.param("term"));
      res.send(results);
   })

})



// app listen port

app.listen(3000, function () {
    console.log('Example app listening on port 3000!');
});

Опять же, все, кажется, работает нормально ... но почему я могу получить доступ к своему приложению через http://blank-agency.org:3000?Прежде всего HTTP-запросы должны быть перенаправлены на HTTPS?То же самое для https://blank -агентства / клиентов -> мои данные, отображаемые по URL, кажутся проблемой безопасности, ха-ха

Я получаю, что они обрабатываются на порту 3000, потому что я отправилэто через мое приложение Express, которое прослушивает порт 3000, но как еще его обслуживать?Поскольку nginx с настройкой обратного прокси-сервера выдает ошибку 502, как уже упоминалось, и я уже открыл порты 80 & 443 на моем брандмауэре через iptables в Linux.

netstat -tlpn

покажите nginx на портах 80 и 443

systemctl status nginx

и

nginx -t

все в порядке.

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

Заранее спасибо:)

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Для дальнейшего использования вы можете использовать файлы через Nginx и express-static.

У меня есть это в моем server.js, который обслуживает все файлы в ./public/ при локальном запуске без Nginx.

app.use('/assets', express.static(path.join(__dirname, 'public')));
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));

Затем в конфигурации Nginx у меня есть это для обслуживания того же каталога,В производственной среде он полностью обрабатывается Nginx и никогда не запускает приложение Express для /assets.

location /assets/ {
    alias /home/app/public/;
    sendfile on;
    sendfile_max_chunk 5m;
    tcp_nopush on;
  }

Мой прокси-проход немного сложнее из-за конфигурации Prerender.io, но вы 'Я хочу что-то в этом роде.Это отправит на ваш сервер Express все, что угодно , за исключением /assets/.

location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_redirect off;
    proxy_pass http://127.0.0.1:5000;
}
0 голосов
/ 17 декабря 2018

Для первой части:

app.listen(3000, 'localhost', function () {
  console.log('Example app listening on port 3000!');
});

Это запретит доступ к http://blank-agency.org:3000, потому что теперь node с expressjs не будет прослушивать все адреса, а только localhost.(при условии, что и nginx, и node / expressjs работают на одном и том же сервере).

Для второй части:

location /customers {
    proxy_pass https://localhost:3000/customers;
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection 'upgrade';
         proxy_set_header Host $host;
         proxy_cache_bypass $http_upgrade;
}

Это обратный прокси только https://blank-agency.org/customers до node/expressjs.Чтобы уменьшить нагрузку на конфигурацию, лучше собрать все expressjs URL-адреса по общему пути, например: /api/customers, /api/products, /api/auth и т. Д. Таким образом, вам придется только один раз изменить конфигурацию прокси с /api.

если вам требуется аутентификация, ваше приложение angular и node/expressjs должны реализовать это, тогда у вас будет больше путей для обратного прокси, например location /api/auth { ... } и т. Д. Но эта часть зависит от приложения, nginxбудет просто передавать HTTP-запросы на node/expressjs и ответы клиенту.С точки зрения nginx оно должно быть прозрачным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...