Exposing a local Postgres server for remote access on a custom domain using Nginx as a reverse proxy can be a useful configuration for a variety of scenarios, such as hosting a database for a web application or enabling remote access for database administration tasks. In this blog post, we'll explore some ideas for setting up this configuration on a server running Ubuntu 18.04.
Throughout this post, we'll brainstorm different approaches to setting up a Postgres server for remote access on a custom domain with Nginx reverse proxy, considering factors such as security, performance, and maintenance. Whether you're a seasoned Postgres administrator or just getting started, we hope that this post will provide some useful insights and ideas for setting up this configuration.
Setting up Nginx as a reverse proxy
To set up Nginx as a reverse proxy for a Postgres server, you will need to perform the following steps:
- Install Nginx on your server: To install Nginx on a server running Ubuntu 18.04, you can use the following command:
sudo apt-get update
sudo apt-get install nginx
2. Configure Nginx as a reverse proxy: To configure Nginx as a reverse proxy, you will need to create a new configuration file in the /etc/nginx/conf.d
directory. For example, you might create a file named postgres.conf
with the following contents:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:5432;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
This configuration will cause Nginx to listen for incoming requests on port 80 and forward them to the Postgres server listening on port 5432. You will need to replace example.com
with the domain that you want to use for your Postgres server.
3. Restart Nginx: After saving the configuration file, you will need to restart Nginx to apply the changes. You can do this by running the following command:
sudo systemctl restart nginx
Test the configuration: To test the configuration, you can use a tool such as curl
to send a request to the Postgres server through Nginx. For example:
curl http://example.com
If the configuration is working correctly, you should receive a response from the Postgres server.
Allowing remote connections to the Postgres server
By default, Postgres is configured to only listen for connections from localhost. To allow remote connections to the Postgres server, you will need to perform the following steps:
- Edit the
postgresql.conf
file: Open thepostgresql.conf
file in a text editor and locate thelisten_addresses
parameter. Set this parameter to'*'
to allow Postgres to listen for connections from any host. - Edit the
pg_hba.conf
file: Open thepg_hba.conf
file in a text editor and add a line to allow connections from the IP address of the server where Nginx is running. For example:
host all all 1.2.3.4/32 md5
Replace 1.2.3.4
with the actual IP address of the server where Nginx is running.
3. Restart the Postgres server: After making these changes, you will need to restart the Postgres server to apply the changes. You can do this by running the following command:
sudo service postgresql restart
4. Test the configuration: To test the configuration, you can use a tool such as psql
to connect to the Postgres server from a remote location. For example:
psql -h example.com -U postgres
If the configuration is working correctly, you should be able to connect to the Postgres server from a remote location.
Configuring SSL/TLS for HTTPS
To secure the connection between the client and the Postgres server using HTTPS, you will need to obtain an SSL/TLS certificate and configure Nginx to use it. There are two main options for obtaining a certificate:
- Obtain a certificate from a trusted certificate authority (CA): One option is to obtain a certificate from a trusted CA such as Let's Encrypt or DigiCert. These CAs offer free and low-cost certificates that are widely recognized as trusted by web browsers and other clients. To obtain a certificate from a CA, you will need to follow the CA's specific instructions for generating and installing a certificate.
- Use a self-signed certificate: Another option is to generate a self-signed certificate for testing or development purposes. While self-signed certificates are not trusted by web browsers and other clients by default, they can be useful for testing or prototyping. To generate a self-signed certificate, you can use the
openssl
tool. For example:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout example.key -out example.crt
This command will generate a self-signed certificate and a private key, which you can use to configure Nginx.
To configure Nginx to use an SSL/TLS certificate, you will need to modify the Nginx configuration file that you created earlier. Specifically, you will need to add the following lines to the server
block:
listen 443 ssl;
ssl_certificate /path/to/example.crt;
ssl_certificate_key /path/to/example.key;
Make sure to replace /path/to/example.crt
and /path/to/example.key
with the actual paths to the certificate and private key files.
After making these changes, you will need to restart Nginx to apply the changes. You can do this by running the following command:
sudo systemctl restart nginx
To test the configuration, you can use a tool such as curl
to send a request to the Postgres server over HTTPS. For example:
curl --insecure https://example.com
If the configuration is working correctly, you should receive a response from the Postgres server.
Testing the setup
To test the setup and ensure that everything is working as expected, you can use a tool such as psql
to connect to the Postgres server from a remote location.
To connect to the Postgres server using psql
, you will need to specify the hostname of the server (e.g., example.com
) and the username of a Postgres user that has the necessary privileges to connect to the server.
For example:
psql -h example.com -U postgres
If the setup is working correctly, you should be able to connect to the Postgres server and perform database tasks such as creating tables and inserting data.
You can also use other tools such as pgadmin
or a web-based administration tool to connect to the Postgres server and perform database tasks.
Conclusion
In this blog post, we explored some ideas for setting up a Postgres server for remote access on a custom domain with Nginx as a reverse proxy. We considered factors such as security, performance, and maintenance, and brainstormed different approaches to configuring Nginx and Postgres to allow remote connections.
Please note that these ideas are for brainstorming purposes only and have not been tested. If you have tried any of these approaches and encountered any issues, or if you have any suggestions for improving the setup, please leave a comment below. We'd love to hear from you!
Whether you are a seasoned Postgres administrator or just getting started, we hope that you found this post helpful and informative. If you have any further questions or need more assistance with this topic, please don't hesitate to reach out. We'd be happy to help!
References