Nginx 是目前最流行的 Web 服务器软件,没有之一。它不仅配置灵活,性能也不错,能够轻松支撑高并发访问。本节简单介绍一下如何在 Linux 服务器上安装、配置 Nginx 服务器。
安装
不同 Linux 发行版,程序包安装工具略有不同。在 Ubuntu 下,可以执行 apt 命名进行安装:
服务启停
Nginx 安装好后,可能还没启动。我们可以执行 service 命令查看运行状态:
1
2
|
$ service nginx status
* nginx is not running
|
如果 Nginx 没有启动,可以执行 start 子命令将其开起来:
Nginx 启动成功后,我们就可以用浏览器来访问它。打开浏览器输入 localhost ,可以看到:
这是 Nginx 默认配置提供的欢迎页,想要部署自己的站点,还得对它进行配置,我们稍后介绍。如果您是在 Linux 服务器上操作,不方便打开浏览器查看效果,还可以执行 curl 命令进行测试:
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
|
$ curl http://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
|
service 命令其他常用子命令列举如下:
1
2
3
4
5
6
7
8
|
# 查看运行状态
service nginx status
# 启动服务
service nginx start
# 停止服务
service nginx stop
# 重启服务
service nginx restart
|
配置
Nginx 的配置文件位于 /etc/nginx/ 目录下,里面包含若干配置文件和子目录:
- nginx.conf 主配置文件;
- modules-available 可用的模块配置;
- modules-enabled 启用的模块配置;
- sites-available 可用的站点配置;
- sites-enabled 启用的站点配置;
实际上,Nginx 的配置文件只是 nginx.conf 主配置一个,只不过它可以导入其他配置。例如,sites-enabled 目录中保存启用的站点配置,nginx.conf 通过 include 将它们全部导入:
1
2
3
|
http {
include /etc/nginx/sites-enabled/*;
}
|
Nginx 支持同时配置并运行多个站点,每个站点拆成一个配置文件,管理起来很清晰。实际上,按照惯例站点配置保存在 sites-available 目录下,再通过软链链接到 sites-enabled 目录:
1
2
3
|
$ ls -l /etc/nginx/sites-enabled/
total 0
lrwxrwxrwx 1 root root 34 Jul 29 2021 default -> /etc/nginx/sites-available/default
|
这样一来,如果想要临时关闭某个站点,我们只需将软链删掉。删除软链不会影响位于 sites-available 目录的配置文件,我们随时可以重新软链回来。
注意到,Nginx 安装完毕后,会开启一个默认站点 /etc/nginx/sites-enabled/default :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
|
- listen 设置监听 80 端口,default_server 将当前站点设为默认站点;
- root 设置网站的根目录路径,我们看到的默认欢迎页就位于该目录;
- index 设置网站的索引页,URL 路径如果是个目录,会访问该目录下的索引页;
- server_name 设置该站点的域名,这里忽略域名;
配置示例
SSL证书(HTTPS)
listen 监听端口设置 ssl 启用 HTTPS ,ssl_certificate 和 ssl_certificate_key 指定证书文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name www.fasionchan.com;
# SSL configuration
ssl_certificate /etc/ssl/certs/fasionchan.com.pem;
ssl_certificate_key /etc/ssl/private/fasionchan.com.key;
# 其他配置
# ...
}
|
301重定向
这个配置访问 www.fasionchan.com 域名时返回 301 重定向到 https://fasionchan.com :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name www.fasionchan.com;
# SSL configuration
ssl_certificate /etc/ssl/certs/fasionchan.com.pem;
ssl_certificate_key /etc/ssl/private/fasionchan.com.key;
# 301永久重定向
rewrite ^/(.*)$ https://fasionchan.com/$1 permanent;
}
|
rewrite 第一个参数表示旧 URL 路径,即被访问的 www.fasionchan.com 的资源路径;路径是一个正则表达式,它可以匹配任意路径,括号则表示将匹配内容提取出来;第二个参数表示跳转目的地址,$1
代表正则表达式提取出的路径;第三个参数表示永久重定向,这样 nginx 会返回 301 状态码。
如果想实现 302 临时重定向,将 permanent 改成 redirect 即可:
1
|
rewrite ^/(.*)$ https://fasionchan.com/$1 redirect;
|
此外,我们还可以通过 return 指令来响应 301 永久重定向:
1
|
return 301 https://fasionchan.com$request_uri;
|
其中,$request_uri 是一个内部变量,代表当前请求的 URL 路径。
HTTPS强制跳转
如果站点同时监听 HTTP 和 HTTPS 端口,为 HTTP 配置重定向即可强制跳转到 HTTPS 。
如果站点只监听 HTTPS 端口,而用户用 HTTP 协议请求,Nginx 会返回 497 错误。这是可以通过 error_page 指令配合 301 跳转强制拉回 HTTPS :
1
2
3
4
5
6
7
8
9
10
11
12
13
|
server {
listen 8080 ssl;
listen [::]:8080 ssl;
server_name example.fasionchan.com;
# SSL configuration
ssl_certificate /etc/ssl/certs/fasionchan.com.pem;
ssl_certificate_key /etc/ssl/private/fasionchan.com.key;
# 301永久重定向强制跳转到HTTPS
error_page 497 =301 https://$host:$server_port$request_uri;
}
|
这个例子配置了站点 https://example.fasionchan.com:8080 ,但用户可能错误地通过 http://example.fasionchan.com:8080 来访问。这时 Nginx 将返回 497 错误,而 error_page 指令为 497 错误设置了 301 跳转,跳转到 HTTPS 版本。
反向代理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
server {
# 监听端口
listen 80;
# 代理对外域名
server_name proxy-site.com;
location / {
# 转向服务器
proxy_pass http://dest-site.com;
proxy_redirect default;
}
}
# 服务器集群及权重(可选)
upstream dest-site.com {
server 10.0.0.1:80 weight=1;
}
|
静态资源
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
|
server {
listen 80;
server_name some-site.com;
root /some/path/to/site;
# 缓存图片
location ~ \.(jpg|png|jpeg|bmp|gif|swf)$ {
root /some/path/to/site/images;
if (-f $request_filename) {
expires 7d;
break;
}
}
# 缓存样式
location ~ \.(css)$ {
root /some/path/to/site/css;
if (-f $request_filename) {
expires 3d;
break;
}
}
# 缓存脚本
location ~ \.(js)$ {
root /some/path/to/site/js;
if (-f $request_filename) {
expires 1d;
break;
}
}
}
|
Web Socket 转发
1
2
3
4
5
6
|
location /wsapp/ {
proxy_pass http://wsbackend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
|
【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: