缘起
在决定用自己的电脑搭建一个私人服务器之后,我购买了一个域名,配置了动态域名解析,于是就可以通过域名来访问自己的服务器了。后来我又在这个服务器上搭建了不少网站,并使用Nginx配置了反向代理,以便从公网访问这些网站。这里我记录一下我是如何配置Nginx反向代理的。
前置条件
- 运行Linux系统的电脑 (作为私人服务器)
- nginx (作为HTTP服务器)
- 私有域名 (详细操作请查看之前的帖子“个人网站的建立过程(一):购买个人域名并配置动态域名解析”)
安装并配置nginx
安装nginx
- 安装nginx
1
sudo apt install nginx
- 开启nginx服务
1
sudo 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 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_certificate
和ssl_certificate_key
分别是SSL证书和私钥的路径。 -
一般的动态网站
一般的动态网站指的是有后端代码的网站,如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; } }
配置文件的启用
-
在
sites-available
目录下按照上述的配置文件示例创建一个新的配置文件,如website1.conf
。 -
检查配置文件是否有语法错误
1
sudo nginx -t
如果没有错误,会显示
nginx: configuration file /etc/nginx/nginx.conf test is successful
。 -
在
sites-enabled
目录下创建一个软链接指向这个配置文件。1
sudo ln -s /etc/nginx/sites-available/website1.conf /etc/nginx/sites-enabled/website1.conf
-
重启nginx服务
1
sudo service nginx reload
可以通过下面的命令查看nginx的状态:
1
sudo nginx status
-
通过浏览器访问
www.your.domain.name
,即可看到网站的内容。
负载均衡
如果我们有多个后端服务,我们可以使用Nginx的负载均衡功能。负载均衡可以将请求分发到多个后端服务上,以提高性能和可靠性。由于我暂时只有一台服务器,这里暂时不做详细介绍。等有钱买了多台服务器后再来更新这部分内容。