В настоящее время я пытаюсь настроить блоки виртуального сервера nginx, из-за чего я полностью рвал себе волосы.
По сути, у меня есть экземпляр NodeJS, работающий на капле в DigitalOcean. Цель этого приложения - разместить как веб-сайт, так и api. Я хочу, чтобы оба они работали в одной и той же капле.
Я настроил свое приложение NodeJS с помощью express для создания маршрутизации и т. д., А затем создал http-сервер с помощью приложения express. Поскольку мое объяснение может вызвать путаницу, я включил основные моменты кода ниже:
const API_PORT = 8080;
const WEB_PORT = 8081;
const api = express();
const web = express();
web.use(express.static(path.join(__dirname, '../build')));
web.get('//', (req, res) => {
res.sendFile(path.join(__dirname, '../build', 'index.html'));
})
api.use((req, res, next) => {
const ip = (req. headers['x-forwarded-for'] || '').split(',').pop()
|| req.connection.remoteAddress
|| req.socket.remoteAddress
|| req.connection.socket.remoteAddress
if (req.headers.auth !== AUTHCODE) {
httpError(400, 'Validation failed');
console.warn('Bad Auth Code');
console.warn(req.headers.auth);
console.warn(ip);
return (res.json('Validation failed'));
}
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', '*');
res.setHeader('Access-Control-Allow-Headers', '*');
next();
});
Graph.route(api);
const apiServer = http.createServer(api);
const webServer = http.createServer(web);
apiServer.listen(WEB_PORT, '127.0.0.1', () => {
console.info(`API Server is running on port ${API_PORT}`);
});
webServer.listen(API_PORT, '127.0.0.1', () => {
console.info(`WEB Server is running on port ${WEB_PORT}`);
});
То, что я хочу достичь, показано в приведенном выше коде, но, по сути, я пытаюсь заставить мой сервер api прослушивать порт 8080, а сервер моего веб-сайта прослушивать порт 8081.
Мне сказали, что я могу использовать nginx для создания proxy_pass для этого, хотя мне не удалось заставить его работать должным образом. Ниже вы видите два примера того, что я пытался сделать!
Любой, кто сможет мне помочь, навсегда станет моим героем!
server {
listen lace.guide:443 ssl;
server_name lace.guide www.lace.guide;
ssl_certificate /var/my-server/ssl/myapp.crt;
ssl_certificate_key /var/my-server/ssl/myapp.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location / {
proxy_pass http://127.0.0.1:8080/$request_uri;
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;
}
}
server {
listen api.lace.guide:443 ssl default_server;
server_name api.lace.guide www.api.lace.guide;
ssl_certificate /var/my-server/ssl/myapp.crt;
ssl_certificate_key /var/my-server/ssl/myapp.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location / {
proxy_pass http://127.0.0.1:8081/$request_uri;
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;
}
}
У меня также есть еще одна довольно странная ошибка, которая означает, что если я получаю доступ к своему api.lace.url/something/somethingElse, он фактически попадает в //something/somethingElse на моем сервере (console.info из req.url)





Вот пример того, как сервер и клиент живут на одном сервере и управляются с помощью nginx (настройка ssl для простоты опущена). Все запросы с префиксом /api направляются на сервер, а остальные - клиенту.
upstream client {
server client:3000;
}
upstream api {
server api:5000;
}
server {
listen 80;
location / {
proxy_pass http://client;
}
location /api {
proxy_set_header X-Forwarded-For $remote_addr;
rewrite /api/(.*) /$1 break;
proxy_pass http://api;
}
}