Featured image of post 从公网访问个人网站——Nginx反向代理配置

从公网访问个人网站——Nginx反向代理配置

使用Nginx配置反向代理以便从公网访问自己的服务器或网站

缘起

在决定用自己的电脑搭建一个私人服务器之后,我购买了一个域名,配置了动态域名解析,于是就可以通过域名来访问自己的服务器了。后来我又在这个服务器上搭建了不少网站,并使用Nginx配置了反向代理,以便从公网访问这些网站。这里我记录一下我是如何配置Nginx反向代理的。

前置条件

安装并配置nginx

安装nginx

  1. 安装nginx
    1
    
    sudo apt install nginx
    
  2. 开启nginx服务
    1
    
    sudo systemctl enable nginx
    

Nginx配置文件

配置文件结构

Nginx的配置文件一般在/etc/nginx目录下,目录结构一般如下:

1
2
3
4
5
6
7
8
/etc/nginx
├── ...
├── nginx.conf
├── sites-available
│   ├── default
│   └── ...
└── sites-enabled
    └── ...

其中nginx.conf是nginx的主配置文件,而sites-available目录下存放着所有的网站配置文件。每添加一个新的网站,我们可以把配置文件放在sites-available目录下。

nginx.conf文件中,默认会有如下配置:

1
2
3
4
http {
    ...
    include /etc/nginx/sites-enabled/*;
}

这表明nginx会自动读取sites-enabled目录下的所有配置文件。因此,我们可以在sites-available目录下创建新的配置文件后,可以在sites-enabled目录下创建一个软链接指向这个配置文件,这样nginx就会读取这个配置文件。

配置文件示例

  1. 一般的静态网站

    一般的静态网站指的是只有静态文件的网站,如HTML、CSS、JS等文件。或者前后端分离的网站的前端部分。这种网站的配置文件一般如下:

    1
    2
    3
    4
    5
    6
    7
    
    server {
        listen 80;
        server_name www.your.domain.name;
        root /home/YourUserName/Documents/www/website1/public;
        location / {
        }
    }
    

    其中:

    • listen 80; 表示监听80端口,即HTTP协议的端口。
    • server_name www.your.domain.name; 表示将域名www.your.domain.name指向这个网站。
    • root /home/YourUserName/Documents/www/website1/public; 表示网站的根目录。
    • location / {} 表示所有的请求都会被转发到网站的根目录。

    注意,这里我们将域名指向了~/Documents/www/website1目录下的public文件夹,而非整个website1目录。因为我们不想暴露一些私有文件。

    如果需要配置HTTPS,可以使用如下配置:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    
    server{
        listen 80;
        server_name www.your.domain.name;
        return 301 https://www.your.domain.name$request_uri;
    }
    
    server{
        listen 443 ssl;
        ssl_certificate /home/YourUserName/Documents/www/website1/private/cert.pem;
        ssl_certificate_key /home/YourUserName/Documents/www/website1/private/key.pem;
        root /home/YourUserName/Documents/www/website1/public;
        server_name www.your.domain.name;
        location /{
        }
    }
    

    其中ssl_certificatessl_certificate_key分别是SSL证书和私钥的路径。

  2. 一般的动态网站

    一般的动态网站指的是有后端代码的网站,如PHP、Python、Node.js等,或者在Docker容器中托管的网站。这种网站一般会通过某个特定的端口来访问,如localhost:3000。这种网站的配置文件一般如下:

    1
    2
    3
    4
    5
    6
    7
    
    server {
        listen 80;
        server_name www.your.domain.name;
        location / {
            proxy_pass http://localhost:3000;
        }
    }
    

    其中:

    • proxy_pass http://localhost:3000; 表示将所有的请求转发到localhost:3000,即后端服务的地址。

    如果需要配置HTTPS,可以使用如下配置:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    server{
        listen 80;
        server_name www.your.domain.name;
        return 301 https://www.your.domain.name$request_uri;
    }
    
    server{
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
    
        server_name www.your.domain.name;
    
        ssl_certificate /home/YourUserName/Documents/www/website1/private/cert.pem;
        ssl_certificate_key /home/YourUserName/Documents/www/website1/private/key.pem;
    
        location /{
            proxy_pass http://localhost:3000;
        }
    }
    

配置文件的启用

  1. sites-available目录下按照上述的配置文件示例创建一个新的配置文件,如website1.conf

  2. 检查配置文件是否有语法错误

    1
    
    sudo nginx -t
    

    如果没有错误,会显示nginx: configuration file /etc/nginx/nginx.conf test is successful

  3. sites-enabled目录下创建一个软链接指向这个配置文件。

    1
    
    sudo ln -s /etc/nginx/sites-available/website1.conf /etc/nginx/sites-enabled/website1.conf
    
  4. 重启nginx服务

    1
    
    sudo service nginx reload
    

    可以通过下面的命令查看nginx的状态:

    1
    
    sudo nginx status
    
  5. 通过浏览器访问www.your.domain.name,即可看到网站的内容。

负载均衡

如果我们有多个后端服务,我们可以使用Nginx的负载均衡功能。负载均衡可以将请求分发到多个后端服务上,以提高性能和可靠性。由于我暂时只有一台服务器,这里暂时不做详细介绍。等有钱买了多台服务器后再来更新这部分内容。

comments powered by Disqus