缘起
在决定用自己的电脑搭建一个私人服务器之后,我购买了一个域名,配置了动态域名解析,于是就可以通过域名来访问自己的服务器了。后来我又在这个服务器上搭建了不少网站,并使用Nginx配置了反向代理,以便从公网访问这些网站。这里我记录一下我是如何配置Nginx反向代理的。
前置条件
- 运行Linux系统的电脑 (作为私人服务器)
- nginx (作为HTTP服务器)
- 私有域名 (详细操作请查看之前的帖子“个人网站的建立过程(一):购买个人域名并配置动态域名解析”)
安装并配置nginx
安装nginx
- 安装nginx
1sudo apt install nginx - 开启nginx服务
1sudo systemctl enable nginx
Nginx配置文件
配置文件结构
Nginx的配置文件一般在/etc/nginx目录下,目录结构一般如下:
|
|
其中nginx.conf是nginx的主配置文件,而sites-available目录下存放着所有的网站配置文件。每添加一个新的网站,我们可以把配置文件放在sites-available目录下。
在nginx.conf文件中,默认会有如下配置:
|
|
这表明nginx会自动读取sites-enabled目录下的所有配置文件。因此,我们可以在sites-available目录下创建新的配置文件后,可以在sites-enabled目录下创建一个软链接指向这个配置文件,这样nginx就会读取这个配置文件。
配置文件示例
-
一般的静态网站
一般的静态网站指的是只有静态文件的网站,如HTML、CSS、JS等文件。或者前后端分离的网站的前端部分。这种网站的配置文件一般如下:
1 2 3 4 5 6 7server { 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 15server{ 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_certificate和ssl_certificate_key分别是SSL证书和私钥的路径。 -
一般的动态网站
一般的动态网站指的是有后端代码的网站,如PHP、Python、Node.js等,或者在Docker容器中托管的网站。这种网站一般会通过某个特定的端口来访问,如
localhost:3000。这种网站的配置文件一般如下:1 2 3 4 5 6 7server { 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 19server{ 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; } }
配置文件的启用
-
在
sites-available目录下按照上述的配置文件示例创建一个新的配置文件,如website1.conf。 -
检查配置文件是否有语法错误
1sudo nginx -t如果没有错误,会显示
nginx: configuration file /etc/nginx/nginx.conf test is successful。 -
在
sites-enabled目录下创建一个软链接指向这个配置文件。1sudo ln -s /etc/nginx/sites-available/website1.conf /etc/nginx/sites-enabled/website1.conf -
重启nginx服务
1sudo service nginx reload可以通过下面的命令查看nginx的状态:
1sudo nginx status -
通过浏览器访问
www.your.domain.name,即可看到网站的内容。
负载均衡
如果我们有多个后端服务,我们可以使用Nginx的负载均衡功能。负载均衡可以将请求分发到多个后端服务上,以提高性能和可靠性。由于我暂时只有一台服务器,这里暂时不做详细介绍。等有钱买了多台服务器后再来更新这部分内容。