网上总有人说Nginx很厉害,于是我也去下载了一个。结果刚看完配置文件,就感觉有点头大——这玩意儿怎么比我的代码还难懂?
什么是Nginx?
Nginx(发音为“engine X”)是由俄罗斯人Igor Sysoev开发的一款高性能HTTP和反向代理服务器。它的第一个公开版本0.1.0发布于2004年10月4日,最初是为了解决著名的C10k问题(即同时处理1万个客户端连接)而设计的。
与传统服务器不同,Nginx不依赖线程来处理请求,它使用了更可扩展的事件驱动架构(异步)。这种架构使用小量且可预测的内存。即使在负载下,其内存占用也很小。这意味着Nginx可以从最小的VPS一直扩展到大型服务器集群。
如今,Nginx已经驱动了超过40%的全球前1000网站,成为了Web服务器市场的重要一员。
Nginx vs Apache:为什么选择Nginx?
你可能会问,已经有了Apache这样成熟的Web服务器,为什么还要选择Nginx?让我们来简单对比一下:
- Apache:更稳定,处理动态请求时性能更高,rewrite模块更完善,模块众多。
- Nginx:轻量级,占用资源少,非阻塞异步网络IO模型(epoll),适合高并发场景;处理静态文件时表现更佳,反向代理和负载均衡性能强。
简单来说,如果你需要处理大量并发连接,或者想要构建一个高性能的反向代理和负载均衡器,Nginx通常是更好的选择。
Nginx的架构设计
Nginx有一个主进程(master process)和一个或多个工作进程(worker processes)。主进程的主要目的是读取和评估配置,以及维护工作进程。工作进程则执行请求的实际处理。
这种架构设计带来了几个关键优势:
- 高可靠性:master-worker模式提高了可靠性。
- 低内存消耗:10000个keep-alive模式下的连接仅需要约2.5MB的内存。
- 热部署能力:可以不停机更新配置文件、滚动日志文件、升级程序版本。
安装Nginx
环境准备
在Linux系统中安装Nginx前,需要先安装必要的依赖包:
- 对于基于RPM的系统(如CentOS):gcc、pcre-devel、zlib-devel、openssl-devel等。
- 对于基于Debian的系统(如Ubuntu):build-essential、libpcre3-dev、libz-dev、libssl-dev等。
同时,建议创建一个无法本地登录的用户,专门用于运行Nginx服务。
编译安装Nginx
虽然很多Linux发行版提供了预编译的Nginx包,但编译安装可以让你自定义需要的模块:
- 下载Nginx源码包并解压。
- 执行
./configure命令配置Nginx安装选项。 - 使用
make和make install命令编译并安装Nginx。
安装完成后,可以创建软链接,方便在命令行中直接调用Nginx命令。
Nginx基础配置
配置文件结构
Nginx的配置文件通常位于/usr/local/nginx/conf、/etc/nginx或/usr/local/etc/nginx目录中,默认名为nginx.conf。
配置文件由指令和上下文构成:
- 指令:包含名称和参数,以分号结尾。
- 上下文:分块,你可以在其中声明指令——类似于编程语言中的作用域。
Nginx的配置段主要有以下几项:
- main配置段:全局配置段。
- event:定义event模型工作特性。
- http{}:定义http协议相关的配置。
配置文件主要由简单指令和块指令构成。简单指令由名称和用空格分隔的参数组成,并以分号(;)结尾。块指令与简单指令具有相同的结构,但它不是以分号结尾,而是以一组用大括号({和})括起来的其他指令结尾。如果块指令可以在大括号内包含其他指令,则称为上下文(例如:events、http、server和location)。
基本命令
掌握了配置文件结构后,我们来看看如何控制Nginx:
启动Nginx:
要启动Nginx,只需运行可执行文件:
nginx
控制运行中的Nginx实例:
启动Nginx后,可以通过使用-s参数调用可执行文件来控制它:
nginx -s signal
其中信号可以是以下之一:
stop— 快速关闭quit— 优雅关闭reload— 重新加载配置文件reopen— 重新打开日志文件
例如,要优雅地停止Nginx进程(等待工作进程完成当前请求的服务),可以执行:
nginx -s quit
也可以使用Unix工具(如kill实用程序)向Nginx进程发送信号。例如,如果主进程ID为1628,要发送QUIT信号导致Nginx优雅关闭,请执行:
kill -s QUIT 1628
要获取所有正在运行的Nginx进程的列表,可以使用ps实用程序:
ps -ax | grep nginx
实战示例:配置一个静态Web服务器
理论说了这么多,让我们来动手配置一个实际的静态Web服务器。
创建静态内容
首先,创建两个目录来存放我们的静态内容:
mkdir -p /data/www
mkdir -p /data/images
在/data/www目录中创建一个index.html文件,并添加一些简单的HTML内容。同时,在/data/images目录中放置一些图片文件。
配置Nginx
接下来,编辑Nginx配置文件,设置http块内的server块以及两个location块:
http {
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
}
这个配置做了以下事情:
- 定义一个处理HTTP请求的虚拟服务器。
- 对于URI以
/images/开头的请求,服务器将从/data/images目录发送文件。例如,请求https://127.0.0.1/images/example.png将发送文件/data/images/example.png。 - 对于其他请求,它们将映射到
/data/www目录。例如,请求https://127.0.0.1/some/example.html将发送文件/data/www/some/example.html。
应用配置
要应用新配置,如果尚未启动Nginx,请启动它;或者如果Nginx已在运行,通过执行以下命令向Nginx的主进程发送reload信号:
nginx -s reload
如果某些内容无法按预期工作,可以尝试在/usr/local/nginx/logs或/var/log/nginx目录中的access.log和error.log文件中查找原因。
进阶配置:反向代理服务器
Nginx的另一个常见用途是作为反向代理服务器。这意味着它接收请求,将请求传递给代理服务器,从中检索响应并将其发送给客户端。
配置后端服务器
首先,我们通过向Nginx的配置文件添加另一个server块来定义一个代理服务器:
server {
listen 8080;
root /data/up1;
location / {
}
}
这是一个监听端口8080的简单服务器,它将所有请求映射到本地文件系统上的/data/up1目录。创建此目录并将index.html文件放入其中。
配置代理服务器
接下来,修改之前的服务器配置,使其成为代理服务器配置:
server {
location / {
proxy_pass https://127.0.0.1:8080;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
这个配置做了以下事情:
- 在第一个location块中,使用
proxy_pass指令指定代理服务器的协议、名称和端口(在本例中为https://127.0.0.1:8080)。 - 第二个location块使用正则表达式匹配所有以.gif、.jpg或.png结尾的URI。相应的请求将映射到
/data/images目录。
高级功能:负载均衡
Nginx还支持负载均衡,可以将流量分发到多个后端服务器。Nginx支持多种负载均衡算法,如轮询、权重、ip_hash等。
配置负载均衡
以下是一个负载均衡的配置示例:
upstream backend_servers {
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers;
}
}
在这个配置中:
upstream块定义了一组后端服务器。- Nginx会将进入的请求按照轮询算法分发到这些服务器。
- 你还可以为不同的服务器指定权重,使某些服务器处理更多的请求。
负载均衡策略
Nginx支持多种负载均衡策略:
- 轮询:默认方式,逐一转发,适用于无状态请求。
- weight(权重):指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
- ip_hash:根据客户端的ip地址转发同一台服务器,可以保持会话。
- least_conn:最少连接访问。
- fair:根据后端服务器响应时间转发请求。
性能优化技巧
调整工作进程
在Nginx配置中,有几个与性能相关的重要参数:
worker_processes auto;
worker_connections 1024;
worker_processes:指定Nginx进程数,建议按照CPU核心数目来指定,一般为它的倍数。例如,对于2个四核的CPU,可以设置为8。设置为auto表示自动调整到可用CPU核心的数量。worker_connections:设置单个worker进程所能够处理的最大并发连接数量。
启用Gzip压缩
启用Gzip压缩可以减少传输数据量,提高响应速度:
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
启用缓存
对于静态资源,可以设置缓存头,减少客户端重复请求:
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
故障排除
当Nginx配置出现问题时,可以查看日志文件来定位问题:
- 错误日志:通常在
/usr/local/nginx/logs或/var/log/nginx目录中的error.log文件。 - 访问日志:在相同目录下的
access.log文件,记录所有客户端请求。
Nginx提供了不同日志级别:debug | info | notice | warn | error | crit | alert | emerg。若要使用debug级别,需要在编译Nginx时使用--with-debug选项。
总结
通过本教程,你已经了解了Nginx的基本概念、安装方法、配置文件结构,并学会了如何配置静态Web服务器、反向代理和负载均衡。你还学习了一些性能优化技巧和故障排除方法。
Nginx的强大之处远不止于此——它还可以实现动静分离、高可用性、SSL终端代理等高级功能。但掌握了本教程的基础知识后,你已经具备了进一步探索的能力。
记住,Nginx的配置是一个渐进的过程,不要期望一开始就完美。从简单的配置开始,逐步测试和调整,你很快就会熟练驾驭这个强大的Web服务器。
Nginx配置文件的核心结构,就像搭积木一样简单。首先,main全局配置是基础;接着,events块定义连接处理方式;然后,在http块内,可以定义一个或多个server虚拟主机;每个server中又可以包含多个location来处理特定请求。
7502

被折叠的 条评论
为什么被折叠?



