我在无数个项目中用到了Nginx。今天,我将从实战角度出发,分享Nginx的安装、基础配置以及一些高级功能的使用经验。希望通过这篇文章,你能掌握Nginx的基本使用,并能解决一些常见问题。
一、Nginx安装
首先,我们从Nginx的安装开始。假设你已经下载好了Nginx的源码包,比如nginx-1.18.0.tar.gz
。
-
解压源码包
tar -zxvf nginx-1.18.0.tar.gz cd nginx-1.18.0
-
配置安装目录
在安装之前,可以通过
--prefix
参数指定Nginx的安装目录。如果不指定,默认会安装在/usr/local/nginx
。./configure --prefix=/usr/local/nginx make make install
-
检查安装结果
安装完成后,进入
/usr/local/nginx
目录,你会发现有sbin
目录,其中包含了nginx
可执行文件。cd /usr/local/nginx ls sbin # 输出: nginx
执行
./sbin/nginx
启动Nginx,然后在浏览器中访问http://localhost
,如果看到Nginx的欢迎页面,说明安装成功。
二、基础指令
Nginx的配置文件是nginx.conf
,通常位于安装目录下的conf
目录中。以下是一些基础指令的介绍。
-
listen
用于配置Nginx监听的端口号。
server { listen 80; }
-
server_name
用于配置虚拟主机的域名。
server { listen 80; server_name www.example.com; }
-
location
location
指令用于匹配用户请求的URI,并执行相应的操作。=
:精确匹配^~
:前缀匹配~
:区分大小写的正则匹配~*
:不区分大小写的正则匹配/
:通用匹配,匹配所有请求
示例:
server { listen 80; server_name www.example.com; location = / { # 只匹配根目录的请求 index index.html; } location /images/ { # 匹配以/images/开头的请求 root /data; } location ~ \.(gif|jpg|png)$ { # 匹配以.gif、.jpg或.png结尾的请求 root /data/images; } }
三、反向代理与域名重定向
Nginx的反向代理功能非常强大,可以用来代理后端的服务。
-
反向代理示例
假设我们有一个后端服务运行在
127.0.0.1:8080
,我们可以通过Nginx来代理这个服务。server { listen 80; server_name www.123.com; location / { proxy_pass http://127.0.0.1:8080; } }
当你访问
http://www.123.com
时,请求会被转发到http://127.0.0.1:8080
。 -
域名重定向
如果你想把一个域名重定向到另一个域名或路径,可以使用
return
指令。server { listen 80; server_name old.example.com; location / { return 301 http://new.example.com; } }
四、限流配置
限流是Nginx的一个重要功能,可以用来保护后端服务不被过载。
-
漏桶算法与令牌桶算法
- 漏桶算法:强行限制数据的传输速率。
- 令牌桶算法:限制数据的平均传输速率,并允许某种程度的突发传输。
-
限流配置示例
使用
limit_req_zone
和limit_req
指令来实现限流。http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { listen 80; server_name www.example.com; location / { limit_req zone=one burst=5 nodelay; proxy_pass http://127.0.0.1:8080; } } }
zone=one:10m
:定义一个大小为10M,名字为one
的内存区域。rate=1r/s
:限制每秒1次请求。burst=5
:设置一个大小为5的缓冲区,当请求超过限制时,可以先放到缓冲区中。nodelay
:如果设置,超过访问频次且缓冲区也满了时,直接返回503。
五、负载均衡
Nginx的负载均衡功能可以用来分发请求到多个后端服务器。
-
负载均衡方式
- 轮询:默认方式,每个请求按顺序分配到后端服务器。
- 权重:指定每个服务的权重比例。
- ip_hash:根据访问IP的hash结果分配,每个访客固定访问一个后端服务。
- least_conn:将请求分配到连接数最少的服务上。
- fair:按后端服务器的响应时间来分配请求(需要第三方模块)。
-
负载均衡示例
http { upstream backend { server 192.168.1.100; server 192.168.1.101; server 192.168.1.102 weight=2; } server { listen 80; server_name www.example.com; location / { proxy_pass http://backend; } } }
upstream backend
:定义了一个名为backend
的服务器组。server 192.168.1.102 weight=2
:指定192.168.1.102
的权重为2,其他服务器默认权重为1。
六、动态负载均衡与高可用集群
-
动态负载均衡
使用
Consul+upsync+Nginx
可以实现无需reload的动态负载均衡。传统的负载均衡需要每次重新加载nginx.conf
,而动态负载均衡可以实现Upstream的可配置化、动态化。 -
高可用集群
使用
LVS+Keepalived+Nginx+Tomcat
可以搭建高可用双机主从热备集群。- Nginx:两台Nginx主备关系,只有一台在工作。
- Tomcat:集群,同时工作。
- Keepalived:安装在两台Nginx上,配置不同。
- LVS:Linux虚拟服务器,实现四层负载均衡。
Keepalived的健康检查和失败切换功能可以确保当主Nginx出现问题时,备Nginx可以接管业务,提高服务的稳定性。
七、静态资源配置
-
sendfile
用于配置文件读取方式,可以提高文件传输效率。
http { sendfile on; }
-
tcp_nopush
在
sendfile
开启的情况下,提高网络包的传输效率。http { tcp_nopush on; }
-
tcp_nodelay
在keepalive连接下,提高网络包的传输实时性。
http { tcp_nodelay on; }
-
gzip
用于压缩传输内容,减少带宽占用。
http { gzip on; gzip_comp_level 2; gzip_http_version 1.1; }
gzip_comp_level 2
:设置压缩级别为2。gzip_http_version 1.1
:只对HTTP/1.1协议的请求进行gzip压缩。