낮은 포트번호는 이미 OS단에서 예약이 되어있기 때문에 80포트를 노드에게 허락해주지 않는다. 노드에서 80포트를 사용하고 싶은데 Error: listen EACCES: permission denied 0.0.0.0:80
에러가 발생할 때는 포트포워딩 명령어를 사용해준다.
# http 사용
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 5354
# https 사용
sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 5355
✱ 등록된 정책 조회 명령어
$ sudo iptables -t nat -L PREROUTING --line-numbers
$ sudo iptables -t nat -L
✱ 등록된 정책 삭제 명령어
$ sudo iptables -t nat -D PREROUTING 4
✱ 등록된 정책 저장 명령어
서버 재기동 후, http 혹은 https 적용이 안되는 경우는 iptables 정책이 저장되어 있지 않아서 일 수 있습니다. iptables 설정 내용을 저장해주세요.
$ sudo sh -c "iptables-save /etc/iptables.rules"
import config from 'config';
import http from 'http';
import https from 'https'
import { app } from './components/app.js';
import { Logger } from './lib/logger/logger.js';
import { promises as fs } from 'fs';
const logger = Logger(import.meta.url);
logger.info(`PORT: ${config.get('app.port')}`);
logger.info(`NODE_ENV: ${process.env.NODE_ENV}`);
logger.info(`NODE_CONFIG_ENV: ${config.util.getEnv('NODE_CONFIG_ENV')}`);
logger.info(`Elasticsearch Host: ${config.get('elasticsearch.nodes')}`)
const port = config.get('app.port');
const https_port = config.get('app.ports');
try {
http.createServer(app).listen(port);
logger.info(`HTTP server listening on port: ${port}`);
} catch (err) {
logger.error('Error setting up http servers:', err);
}
// certbot
try {
const key = await fs.readFile(config.get('app.https_certbot.key'))
const cert = await fs.readFile(config.get('app.https_certbot.cert'))
const ca = await fs.readFile(config.get('app.https_certbot.ca'))
const options = {
key: key,
cert: cert,
ca: ca
};
https.createServer(options, app).listen(https_port);
logger.info(`HTTPS server listening on port: ${https_port}`);
} catch (err) {
logger.error('Error setting up https servers:', err);
}
"app": {
"host": "http://yourhost.com/",
"port": 5354,
"ports": 5355,
"https" : {
"key": "/yourpath/ssl/server.key",
"cert": "/yourpath/ssl/server.crt"
},
"https_certbot" : {
"key": "/yourpath/ssl_certbot/privkey.pem",
"cert": "/yourpath//ssl_certbot/cert.pem",
"ca": "/yourpath/ssl_certbot/chain.pem"
},
...
}