Не срабатывает маршрут express
Уже второй пример с одним итогом- не работает маршрутизация express.
Удаленный сервер Ubuntu 18.04 Примеры из: https://metanit.com/web/nodejs/6.9.php и https://metanit.com/web/nodejs/6.5.php скрипт запускается выдает в консоли "Сервер ожидает подключения..." Но при открытии из браузера и по http и по https страничка открывается, но не видит маршрута: "jquery-2.2.4.min.js:4 GET http://funprograms.ru/api/users 404 (Not Found)". Прописывал в маршруте console.log("/api/users"); Соответственно этого сообщения не увидел в консоли Linux. Возможно не видит сам скрипт js. На сервере путь к файлам /var/www/funprograms.ru/html Здесь скрипт js, а в /var/www/funprograms.ru/html/public статический html Попробовал перенести файлы на уровень выше в /var/www/funprograms.ru/ Ничего не изменилось каталог funprograms.ru имеет права root, а рассматриваемые файлы и каталог public права другого пользователя. При этом права каталога funprograms.ru я не могу сменить на пользовательское из под WinSCP (FTP клиент) запущенного под root. Может быть что то с правами доступа к файлам, каталогам? |
ожидает то ожидает в примере сервер запускается на порту 3000, если вы его просто скопипастили, тогда возможно будет работать так http://funprograms.ru:3000/api/users
|
Да вы правы, но под 5000 портом.
Еще одна особенность: Это я написал под 5000 портом. ( http://funprograms.ru:5000/api/users Выдает данные) Если тоже самое сделать на 3000, то не открывается даже страничка html http://funprograms.ru и https://funprograms.ru При этом http://funprograms.ru:3000/api/users выдает данные Дайте совет как применять такие примеры к реальному серверу? порты 3000 и 5000 и 27017 открыты |
надо запускать сервер на 80 порту чтобы он открывался по ссылке http://funprograms.ru... надо убедить что другие службы не занимают этот порт, если установлен http-proxy (nginx, apache), тогда надо сделать в них переадресацию с порта экспресс сервера,... если нужен https тогда экпресс тоже должен работать в https режиме...
|
В большинстве UNIX-подобных ОС прослушивание портов с номерами 0—1023 требует особых привилегий (root). Другие номера портов выдаются операционной системой первым запросившим их процессам без root привелегий
Узнать что весит на порту sudo lsof -i :3000 В продакшене использовать связку Nginx в качестве proxy и https://github.com/Unitech/pm2 |
Большое спасибо за ответы.
Я немного знаком с pm2, пробовал запускать скрипты с помощью его. У меня имеется nginx на сервере и установлен ssl от Certbot с самообновлением. В /etc/nginx/sites-available остался старый фал default c текстом стандартным и я создал файл funprograms.ru с таким содержимым: server { listen 80; listen [::]:80; root /var/www/funprograms.ru/html; index index.html index.htm index.nginx-debian.html; server_name funprograms.ru [url]www.funprograms.ru;[/url] location / { try_files $uri $uri/ =404; proxy_pass [url]http://localhost:5000;[/url] 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; } listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/funprograms.ru/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/funprograms.ru/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot #return 301 https://funprograms.ru$request_uri; } Область ssl записалась автоматом при установке сертификата. В файле /etc/hosts одна запись: 127.0.0.1 localhost вот что на 80 порту: ![]() Понял почему у меня на 5000 порту открывалась страничка: "proxy_pass http://localhost:5000;" Знаком с командой sudo lsof -i :3000 и использую ее. Бывают ситуации в консоль зависнет и скрипт не закрывается "CTRL+C" и потом убиваю процесс чтобы не висел и не забивал порт. Получается что я запускаю скрипт под localhost:5000 nginx перебрасывает его на 80 порт и он открывается по доменному имени. Но запросы с странички не добираются до /api/users app.get("/api/users", function(req, res){ console.log('Тест error my /api/users'); User.find({}, function(err, users){ if(err) return console.log(err); res.send(users) }); }); Срабатывает только по http://funprograms.ru:5000/api/users а не по http://funprograms.ru/api/users Не обращайте внимания на proxy_pass это автоматом на форум добавилось так как текст разместил как код JS |
Попробуйте так
Код:
server { |
Poznakomlus, Помогло, огромное спасибо !!! :)
Только маленькая опечатка : listen (:):443 ssl; заменил на: listen (:):443 ssl; Отображается на форуме неправильно [ : : ] вместо ( : ), ну да ладно Теперь мне остается разобраться в этом. Пару вопросиков: 1) А доступ к сайту через www. как сделать? в секции server_name funprograms.ru; пробовал добавить www.funprograms.ru не работает так 2) Сейчас стоит "root /var/www/api;" а было /var/www/funprograms.ru/html ( здесь скрипт и лежит). Но это вроде как никак не повлияло на работу |
1. server_name funprograms.ru www.funprograms.ru;
так должно работать иначе смотреть, что показывает nginx -t 2. Да это лишнее |
Пробовал server_name funprograms.ru www.funprograms.ru;
Но по www.funprograms.ru перенаправляет на заглушку nginx а не https://funprograms.ru nginx -t выдает все в порядке Сервер nginx разумеется перезапускал. |
удалите запись с /etc/hosts
посмотрите другие конфиги, чтобы с www не был дефолтным в папке с nginx grep -irl ' www.funprograms.ru' |
Poznakomlus, спасибо Вам огромное за помощь!
Если с /etc/hosts удалить все, то страничка вообще не загружается Было в /etc/hosts: 127.0.0.1 localhost # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters Сейчас я закомментировал все кроме 127.0.0.1 localhost Удалил default файл nginx и его ссылку в : /etc/nginx/sites-available /etc/nginx/sites-enabled До этого по команде grep -irl ' www.funprograms.ru' в /etc/nginx/ отображал только sites-available/funprograms.ru и sites-available/funprograms_.ru Удалил sites-available/funprograms_.ru После всего этого при запуске с транички www.funprograms.ru ничего нету и переадресации на https://funprograms.ru нет. по https://funprograms.ru и funprograms.ru как и было- хорошо |
Цитата:
попробуйте server { listen 80; server_name funprograms.ru www.funprograms.ru; rewrite ^ https://$host$request_uri? permanent; } server { server_name funprograms.ru www.funprograms.ru; index index.html; access_log /var/log/nginx/funprograms.ru.access.log; error_log /var/log/nginx/funprograms.ru.error.log error; listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/funprograms.ru/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/funprograms.ru/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot add_header Strict-Transport-Security "max-age=31536000" always; # managed by Certbot ssl_stapling on; # managed by Certbot ssl_stapling_verify on; # managed by Certbot location / { client_max_body_size 100m; client_body_timeout 600s; client_body_in_file_only clean; client_body_buffer_size 16K; proxy_connect_timeout 70; proxy_send_timeout 90; proxy_read_timeout 90; proxy_redirect off; proxy_set_header host $host; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-forward-for $proxy_add_x_forwarded_for; proxy_pass http://localhost:5000; } } смотрите файлы логов в /var/log/nginx и сертификат придется сгенерировать еше раз для сервера с www и без dehydrated -c -d funprograms.ru -d www.funprograms.ru |
Poznakomlus,
Большое при большое спасибо Вам! Я перезаписал этот файл. В итоге заработало при запросе : www.funprograms.ru перенаправляет на https://www.funprograms.ru/ При funprograms.ru на https://funprograms.ru/ Но я не генерировал нового сертификата и все работает. Он слетит спустя время наверное, если не сделаю dehydrated -c -d funprograms.ru -d www.funprograms.ru ? |
sudo su
crontab -e 0 0 1 * * /usr/bin/dehydrated -c повесьте на крон проверьте только полный путь к dehydrated which dehydrated |
Poznakomlus,Спасибо!!!
Я устанавливал SSl по мануалу: https://www.ssllabs.com/ssltest/ в файле /etc/cron.d/certbot: # /etc/cron.d/certbot: crontab entries for the certbot package # # Upstream recommends attempting renewal twice a day # # Eventually, this will be an opportunity to validate certificates # haven't been revoked, etc. Renewal will only occur if expiration # is within 30 days. # # Important Note! This cronjob will NOT be executed if you are # running systemd as your init system. If you are running systemd, # the cronjob.timer function takes precedence over this cronjob. For # more details, see the systemd.timer manpage, or use systemctl show # certbot.timer. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew При проверки сертификата по: https://www.ssllabs.com/ssltest/ Изначально выдавало A статус, теперь B. Наверное из-за открытых незащищенных портов или еще чего то. Проверка обновления сертификата: sudo certbot renew --dry-run ![]() В лог файле в итоге : /var/log/letsencrypt/ 2020-02-15 09:37:42,879:DEBUG:certbot.renewal:no renewal failures. Значит все хорошо. |
Часовой пояс GMT +3, время: 02:32. |