Nginx系列之新手入门

Vevina ·
更新时间:2024-09-20
· 963 次阅读

Nginx是一个高性能的HTTP以及反向代理服务器,同时提供了诸如邮件、TCP/UDP代理服务以及负载均衡等功能。在本文中,将初步的介绍nginx安装、使用及其基本配置,并以一个使用者视角提供一些简单需求下的nginx配置。

Nginx安装

对于windows用户,Nginx官网提供了二进制包的下载。

对于Unix-like的用户,可以使用包管理工具下载,例如:

# 采用deb包的Linux,如Debian、Ubuntu $ apt-get install nginx # 采用rpm包的Linux,如RedHat、CentOS $ yum install nginx # MacOS $ brew install nginx # FreeBSD $ pkg_install -r nginx # ...

另外,也可直接通过源码编译。Nginx的源代码BSD协议开源,可通过官网或Github获得其源码。

Nginx使用

在完成Nginx的安装后,可以通过nginx命令启动,并可以使用nginx -s [signal]执行特定的操作:

reload:重新加载配置 reopen:重新打开日志文件 stop:快速退出nginx,无论是否存在正在处理中的请求 quit:在所有处理中的请求结束后再退出Nginx

另外,Nginx提供了下列几个参数:

-h:显示帮助信息 -v:显示版本信息 -V:显示版本及编译配置信息 -t:检查配置文件正确性 -T:检查配置文件正确性并输出配置信息 -q:检查配置时不输出非错误的信息 -p prefix:指定路径前缀 -c filename:指定配置文件 -g directives:传入配置文件外的参数

启动nginx后,可访问本地80端口测试nginx是否正常运行。

Nginx配置

Nginx配置文件通常位于/usr/local/nginx/conf/etc/nginx/usr/local/nginx/etc目录下,在修改配置后可以通过nginx -t测试并通过nginx -s reload命令重新加载配置。

Nginx配置包括了简单命令以及块命令。其中,块命令中可以包含简单命令以及块命令。其语法规则如下:

# 简单命令 命令 参数; # 块命令 块名 { 命令 参数; # ... }

下面是一个简单的Nginx配置示例:

use nginx; http { server { location / { root /data/www; } } }

在了解了基本的Nginx配置规则后,下面通过几个示例来介绍Nginx的使用。

静态内容提供

张三编写了一个本地门户网站,准备通过Nginx将其公开到互联网上。站点内容存放在/data/www目录下,需要实现通过服务器的ip可以访问该网站。使用下方的配置替换nginx.conf中的http模块。

http { server { root /data/www; } }

http模块包括了有关与HTTP服务的相关配置,它需要位于Nginx主模块上下文中(即配置文件中最外层,而非其他块中)。

server块用于定义一个虚拟服务及其配置(即一个站点),它需要位于http上下文中。Nginx的http服务支持创建多个虚拟服务,每个虚拟服务对应于一个http块中的server配置块。对于一个虚拟服务,它默认会监听80端口的所有请求,并根据请求及配置寻找对应的资源。在server块中,可使用root命令设定资源的目录,即上例中所有的请求将获取/data/www目录下定义的资源。

随着网站的发展,图片资源文件也越来越多。为了方便对代码的管理,张三决定将图片资源转移到/data/images目录下。由于图片目录不再位于站点目录下,所以需要修改nginx配置使当url包含/images/是前往/data/images目录寻找对应资源。

http { server { root /data/www; # 等同于: # location / { # root /data/www; # } location /images/ { root /data/images; } } }

location块用于对一些特定的URL进行配置,格式为location [url匹配规则] { },它需要位于server块或其他location块中。

为了实现张三需要的效果,需要定义图片资源对应的location块location /images/ { }。当请求路径包含/images/时,需要告知nginx资源目录为/data/images,所以在location块中,也添加了root /data/images;命令指定资源目录。

正则匹配

网站的发展越来越快,张三准备在网站中支持音频资源,但是不像图片资源一样都在url中包含/images/。为了实现这个需求,可以使用正则表达式匹配资源后缀名。当资源后缀为音频格式时(如.mp3.wav等),请求目录将为/data/musics,否则仍为/data/www/data/images

http { server { # ... location ~ \.(mp3|wav)$ { root /data/musics; } } }

在Nginx配置文件中使用正则表达式,需要以~作为标志,其后跟着自定的正则规则。例如例子中的\.(mp3|wav)$代表了匹配.mp3或.wav结尾的请求地址。

多站点

在网站上线后,张三准备将自己的博客也放到服务器上。上一节介绍过,http块中可以有多个server用于提供多个网站,那为了增加这个博客就只需要再加个server块就行了。但是张三很快意识到了一个新的问题,增加了server块后检查配置文件,得到了这样一个警告信息:nginx: [warn] conflicting server name "" on 0.0.0.0:80, ignored,即多个服务配置监听同个端口,Nginx将忽略后定义的服务配置。为了解决这个问题,张三决定把博客的端口设置为8080。

http { # ...之前的内容 server { listen 8080; location / { root /data/blog; } } }

listen命令用于指定服务监听的地址及端口,其格式为listen [地址]:[端口] [其它选项]。未显式使用listen命令的情况下,服务将使用80端口(HTTP)服务或443端口(HTTPS服务)。对于一个服务,可监听多个地址及端口,即listen命令可多次使用。下面是listen命令的示例:

listen 192.168.1.1:80; listen 127.0.0.1; listen [:::a83f:3d82]:80; # IPv6 listen 443 ssl;

对于listen命令的选项,有以下几个常用的选项:

default_server:无其它匹配服务的情况下的默认服务,在未指定的情况下第一个server会被隐式设为default_serverssl:必须使用SSL,即通过HTTPS访问。

但是一直通过ip及端口访问体验非常糟糕,于是张三便购买了自己的域名zhangsan.com。通过www.zhangsan.com可以访问门户网站,通过blog.zhangsan.com访问博客,无需使用非80端口。于是,就可以使用Nginx的server_name命令指定虚拟服务的识别路径。

http { server { server_name blog.zhangsan.com; # ... } server { server_name www.zhangsan.com; # ... } }

server_name命令的格式为server_name hostname1 [hostname2...]。对于一个server块,可分配一个或多个主机名,nginx会根据请求头部的Host字段匹配到对应的服务。下面是server_name的几个示例:

server_name www.zhangsan.com; server_name www.zhangsan.com zhangsan.com; server_name *.zhangsan.com; server_name .zhangsan.com; # *.zhangsan.zhangsan.com server_name *.zhangsan.*; server_name ~^(www)\.zhangsan\.com$; # 使用较为复杂的正则表达式 server_name _; server_name "";

对于使用通配符的名称,*只能在最前端或最后端,例如w*.zhangsan.com是不合法的。

当使用server_name _时,该服务将匹配任意路径。当没有使用server_name时,会隐式设置为server_name "",该服务为无匹配服务情况下的默认服务。

结束语

本文中简单介绍了关于Nginx的安装、配置以及使用,后续将会继续深入了解Nginx的反向代理、负载均衡等功能,并在源码层面上对Nginx进行分析。

参考资料 Nginx documentation. Dimitri Aivaliotis. Mastering Nginx. Martin Fjordvald, Clement Nedulcu. Nginx HTTP Server, Fourth Edition. ghosind 原创文章 29获赞 31访问量 7万+ 关注 私信 展开阅读全文
作者:ghosind



新手入门 Nginx

需要 登录 后方可回复, 如果你还没有账号请 注册新账号