Linux下如何安装并配置Nginx服务

banner

前言

当我们在部署前端应用时,总是需要一个HTTP服务器来托管应用的静态文件。亦或者当我们想要分流各种网络请求时,会需要一个网关服务器。可以承担上述职责的应用有很多,笔者比较熟悉的则是Nginx,由于近期时常需要重新部署Nginx,而过程中有许多重复使用的命令,本人的记性又很差,每次都要重新在网上搜索一轮,花费了许多时间,因此在这里写一篇笔记,以记录在Linux上安装并配置Nginx的一些流程和命令。

本人使用的发行版Linux为Ubuntu,因此下述的内容仅适用与Ubuntu。

常用命令

安装前进行系统的软件包更新:

1
2
sudo apt-update
sudo apt-upgrade

安装nginx本体:

1
sudo apt-install nginx

nginx配置文件更新后的重载:

1
sudo systemctl reload nginx

切换到nginx的根目录:

1
cd /etc/nginx

切换到nginx的可用站点配置文件所在目录:

1
cd /etc/nginx/sites-available

切换到nginx的日志文件所在目录:

1
cd /var/log/nginx

配置文件

nginx的配置逻辑大概为:在sites-available下的文件默认不会被读取,要想实际将某个配置文件映射至服务器,则需将该配置文件以软链接的形式放在sites-enabled下。

笔者部署的站点很少,无需分文件管理,这里我们仅以修改默认的default文件为例:

首先一个比较常用的功能是:将所有访问80端口的http请求重定向至443以使用https,这也是我们在浏览器访问一个链接时,无论是否指明https,最终都会访问https的原理:

1
2
3
4
5
6
7
8
9
10
11
12
server {
# 监听IPV4端口
listen 80;

# 监听IPV6端口
listen [::]:80;

# 指定访问需携带的域名
server_name www.xxxxxxx.com;

return 301 https://$host$request_uri;
}

重定向后,自然我们也得开启一个https的服务器才行,否则重定向没有意义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
server {
# 监听IPV4端口
listen 443 ssl http2;

# 监听IPV6端口
listen [::]:443 ssl http2;

# 指定访问需携带的域名
server_name www.xxxxxxx.com;

# 配置相关ssl证书
ssl_certificate /etc/nginx/certs/cloudflare.crt;
ssl_certificate_key /etc/nginx/certs/cloudflare.key;

# 开启HSTS以提高安全性
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";

# 将以“api”开头的请求全部转发至后端:http://localhost:4000
location /api {
proxy_redirect off;
#proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:4000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

# 默认的http静态文件的位置
location / {
root /var/www;
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ /index.html =404;
}
}

还有一个比较重要的配置是:阻止任何仅用IP而不带链接访问的请求,这个可以增加安全性以及防止强迫症。

1
2
3
4
5
6
7
8
server {
listen 80 default_server;
listen [::]:80 default_server;

server_name _;

return 444;
}