Can't access Node.js server on web server - node.js

I'm trying to test a simple Node.js server on my webserver. The problem is that I can't access the Node.js server from my chrome browser and I have searched without any success.
This is my basic server.js script (server side)
var app = require('express')();
app.get('/test', function (req, res) {
console.log('web page opened');
});
app.listen(3000, function () {
console.log('Listening on port 3000');
});
When I run the node in console I get result as expected
public_html$ node server.js
Listening on port 3000
Now when I try to access the URL like this:
http://xxx.xxx.xxx.xxx:3000/test the connection times out and I do not get anything.
This prevents me from using $.ajax form to send data to my node server and the jquery request fails with error as connection timed out issue as well because the URL:3000 with my nodejs port is not accessible.
It seems like my host (Cloudways) does not allow access on any port. If that is case, what can I do really in this situation?
Note: I do not have root access to the server, they can't give root access for security.

Actually going thru Apache to access your app server, nodeJs in your case, is the standard way to avoid security vulnerabilities etc.. You can configure your Apache server as follows:
<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName www.example.com
ServerAlias example.com
ProxyPass / http://localhost:3000/test/
ProxyPassReverse / http://localhost:3000/test/
</VirtualHost>
The you would call your app at http://xxx.xxx.xxx.xxx:80/test or simply at http://xxx.xxx.xxx.xxx/test since 80 is implied for HTTP and apache will call http://xxx.xxx.xxx.xxx:3000/test for you.
EDITED: This should work thru .htacccess too - which is what, it seems cloudways wants you to do : https://support.cloudways.com/what-can-i-do-with-an-htaccess-file/

Best way to test node.js is to use node process manager on your server like https://www.npmjs.com/package/pm2.
This will save a lot of time for deployment. but you will need root access to install this package. if you does not have root access then ask your hosting provider to DO install these packages for you.
If in any case you did not get root access and you have no access to open port and install packages for your project. Then use any other hosting like https://www.linode.com/.

Related

Setup domain for VueJS server on network

I have a project that use a NodeJs server for back-end and VueJs for front-end.
I run the front-end server using this:
npm run serve
Now, I have a domain
duduman.ro
And I want to set the domain for my app that runs on localhost:8080
I tried using apache, but i didn't succeed.(setting virtualhost)
<VirtualHost *:8080>
ServerName duduman.ro
</VirtualHost>
I also tried to set a subdomain: app.duduman.ro for 8080 port, but calling "app.duduman.ro" return "Object not found" and calling "app.duduman.ro:8080" return "Invalid Host header".
PS: The port is forwarded correctly because external ip using port 8080 works just fine.
Check out Heroku node.js app, it should solve your issues.
https://www.heroku.com/nodejs
For me is the easiest way to deploy.

Namecheap: Node JS Express App - App Route return 404 not found

Trying to get Simple Express Application up using NameCheap Shared Hosting.
I have set up my Node JS application as Described here NodeJS NameCheap Docs
Current Setup:
Application Root: url.com
Application URL: url.com
Application Startup File: server.js
I have ran NPM Install using the button provided
I have tried loading the URL http://url.com/hello Expecting Hello World to displayed in the Page.
var express = require("express");
var app = express();
const port = 3001;
app.set("port", port);
app.get("/hello", function(req, res) {
res.send("hello world");
});
app.listen(app.get("port"), () =>
console.log("Started listening on %s", app.get("port"))
);
The results I am getting when navigating to http://url.com/hello:
Not Found
The requested URL /index.php was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
Namecheap only tells you how to configure the nodejs app however their hosting is based on cPanel which requires you configure the webserver (apache generally). Once you get an application running there’s a special button to register it for the apache configuration aka let it run from your domain. I don’t know the steps by heart but you should ask NC support to direct you to their documentation for configuring apache to run a nodejs app you configured.
If they do not link an article from their knowledge base use this link: https://confluence1.cpanel.net/plugins/servlet/mobile?contentId=17190639#content/view/17190639
Basically what you need now is to configure cPanel or ssh into your server and test your app locally. There’s a number of things that could cause your issues like incorrect apache configuration (your default port 80 is looking for php app), port not open/firewalled, application not registered - and all of this is cPanel specific.
To make sure you are reading the correct document check in namecheap cpanel for the docs button and review all the above. It should be obvious what needs configured - your nodejs code is probably not the cause here
In my case, it was the problem with .htaccess file. Adding the following rules in my .htaccess file present in the website's public directory helped me:
# CLOUDLINUX PASSENGER CONFIGURATION BEGIN
PassengerAppRoot "/home/<user>/<your_nodejs_app_folder>"
PassengerBaseURI "/."
PassengerNodejs "/home/<user>/nodevenv/<nodejs_app>/<version>/bin/node"
PassengerAppType node
PassengerStartupFile <startup_script>.js
# CLOUDLINUX PASSENGER CONFIGURATION END
Make the required changes in the above rules before pasting them in your .htaccess file. Also, just in case, make sure the port you are using is open, via customer support.

Access Node.js server by URL without port at the end

My server is running on a Node.js environment with Express. My server works fine, but I can't remove the port at the end of the domain name from the URL.
What is the right way to access my app with an URL without port at the end ?
Client side
By default, the port is 80 when a browser make an HTTP request.
If you type localhost, the real request is localhost:80 because no port is specified. It will be the same with any domain name. If you type example.com, the real request is example.com:80.
It is the client (here the browser) which choose on which port it will make his request to the server.
You can force your browser to emit a request on any port by adding :port_number after the domain name, as localhost:3000 or example.com:3000. Here we change the port from 80 to 3000.
Server side
The web server chooses on which port it listens for requests. It can be 80, 3000 or any other port.
If a client makes an HTTP request, your web server needs to listen to the right port. If the client emits example.com:4000, your web server must listen on port 4000 to get and process the request.
To make a web server, you can use Node.js, Apache (used in LAMP), Nginx etc. You can have multiple web servers running on your system and each of them can use multiple ports, but you can't make them listen on the same port. One of your web server may not start or could take the lead on others or crash...
Solutions are to use only one web server or to use multiple web server on different ports. In your situation, you are using LAMP so Apache web server. Its probably running on port 80 in his configuration. In this case you can't run a Node web server on port 80 because it's already in use. You should choose another port like 3000 for example. Both Node and Apache will then run on your system but on different ports respectively 3000 and 80.
In this last situation, you can access directly to Apache, but not to Node without precise the port 3000. To be able to access Node web server by port 80 without stopping Apache, you need to go through Apache and to make it redirect requests to your Node server in some cases. To do that, you need to configurate a proxy in your Apache. Note that it would be the same if you was using Nginx or other web servers.
Example
Let's take a simple express server on port 3000 :
// server.js
var express = require('express'),
app = express(),
http = require('http').createServer(app),
port = 3000;
app.get('*', function (req, res, next) { res.sendFile(__dirname + '/views/index.html'); });
http.listen(port, function () { console.log('App running & listening on port ' + port); });
If you type in the terminal node server.js, you can access from browser by localhost:3000, but you can't access by localhost because no web server is running on port 80.
If you change port variable to 80, you can access from browser by localhost or localhost:80, but not by localhost:3000 anymore.
If you edit /etc/hosts (sudo nano /etc/hosts) with a new line 127.0.0.1 example.com, you can access from browser by example.com if port is 80, else example.com:port_number like example.com:3000. This third solution maps domain name to ip address in your local client only.
If the chosen port, 80 for example, is already in use by another process (as LAMP), your node server may not works. In this case you should close this other process first or choose another port for your node process. In the third example, if you close the LAMP first, you can access from browser by example.com, if you choose another port for Node, you can access from browser by example.com:port_number like example.com:3000 for Node and still access your LAMP server on port 80.
Don't forget that 80 is the default port used by the browser if no port is specified. If you use another port, you should precise it from the browser by adding :port_number after your domain.
Now if you own a real domain name you will need to make a real DNS mapping not juts edit /etc/hosts. Configure your DNS on your registar account (where you bought your domain name) to make it point to your server's IP. Like that, when a client make an HTTP request to the domain name, it will be redirected to your server.
To have both Apache and Node.js running and available on port 80, you should make a proxy as explain above. Indeed, for you the problem is probably that you have a web server already running on port 80 (Apache with LAMP) and you want also your Node.js app to run on port 80 to don't force clients to precise the port at the end of the url. To fix that, you need to make a proxy in Apache conf to redirect requests which come from the specific domain name to your localhost node server process on the right port.
Something like that in your apache conf :
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
ProxyRequests Off
ProxyPreserveHost On
ProxyVia Full
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
</VirtualHost>
Here when a request arrive on your server on port 80, Apache will check if it comes from example.com and if it is, it will redirect to 127.0.0.1:3000 where your node server will take the lead. The two different process (Apache & Node) should run in the same time on your server on different port.
If you want to run your node js server without any port and simply by http://localhost then listen your express js server on port 80 .
You could either do as stated by the previous answers and run on port 80 OR
you could keep the server running on whatever port you want and setup a proxy server such as nginx and forward the HTTP requests to said server.
This could be helpful in case you want to spin up multiple instances or even different processes.
When you see a URL, without a port, it means one of two ports are being served:
https:// - port 443
http:// - port 80
Even assuming the port is not in use, you can't service directly to port 80 without superuser privileges because port 80 and port 443 are privileged ports.
If you want to test the server running on port 80 directly:
sudo node index.js
Where index.js is the name of your Express application.
Keeping it running
Because you tagged apache, I'm assuming you want to know how to set up a node server using Apache. If you don't need a production quality server and just want to keep it running all the time, you can do that too.
Dev/Just keep it running
You can daemonize your server. A quick look for a "node" solution exposes forever as a way to do that. Simply install and run like this:
yarn global add forever
# or
# npm i -g forever
# remember, sudo for port 80
sudo forever start index.js
Production/Apache
Use a non-privileged port for Node, and set up a proxy in Apache. Something like:
ProxyPass / http://localhost:8000
If you set the port to 8000. Put that in a <VirtualHost>. Examples here. Likely you would still want to daemonize your nodejs Application using forever or some similar daemon tool (systemd is great for Linux services)

Remove Port From Socket.IO and Change Directory

Using Apache on Ubuntu 15.04 I'm trying to effectively remove the port 3000 from the URL as well as to change the path to http://example.com/{app}/socket.io...
Using ProxyPass and ProxyPassReverse I've removed the port from the URL effectively as well as to update the server and client side accordingly to change the path.
Virtual Hosts changes:
ProxyPass /path/ http://example.com:3000/path/
ProxyPassReverse /path/ http://example.com:3000/path/
The server side changes that I made was the following:
var io = require('socket.io')(http, {path: '/path/socket.io' });
app.get('/path/', function(req, res){
and the client changes that I made was the following:
var socket = io({path: '/path/'});
Everything appeared to run smoothly until I opened up my console log and saw a plethora of GET requests while using chrome. This'll definitely kill my bandwith and I guess I somehow managed to not listen to the socket correctly which resulted in the mass amount of GET requests.
Could someone provide some guidance into what I may possibly be doing wrong?
You're seeing a large number of requests as socket.io is falling back to long polling as Apache is not proxying the websocket connection you'll need to enable this with
mod_proxy_wstunnel
then add
ProxyPass "/path/socker.io" "ws://localhost:3000/"

node js installation on Apache HTTP server (centOS)

I'm working at a project in school that includes Apache server.
All i need to do right now to start working with the server is create An index file (html, ph) at my folder on the server (inside the public_html) and the server will return that page.
but the thing is that I want to write the server with nodejs.
I have already manage to install node on the server but I know how to ignore the Apache server and start working with node.
I read about that and I saw that i need to start node on a different port? or use proxy?
but I really don't know that much about servers.
You can use apache as proxy for nodejs https://httpd.apache.org/docs/2.2/mod/mod_proxy.html.
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
Or, if you want to run the nodejs not from root directory of server
ProxyPass /mynodejsproject http://localhost:3000/
ProxyPassReverse /mynodejsproject http://localhost:3000/
For example, nodejs application listens on 3000 port, apache on 80 port, and it proxies requests to nodejs application.
But i recommend you to use nginx as proxy for nodejs application, this is the config i used in my projects https://github.com/vodolaz095/hunt/blob/master/examples/serverConfigsExamples/nginx.conf
service apache2 stop Stops your apache server (It works on 80 port default)
Also there is a good tool for nodejs ,you will able to manage your nodeJS server(you can give 80 port now) like services with forever on nodeJS.(I assumed you know how to creating your nodejs http server)

Resources