一、前言
Nginx是一个高性能的HTTP和反向代理服务器,由俄罗斯人开发的,第一个版本发布于2004年10月4日。是一款轻量型的Web服务器,其特点是占有内存少,并发能力强,对负载均衡等提供了非常方便的配置。国内几大互联网公司也都在使用,很火,很强大,现在就让我们来领略它的风采。
二、Nginx环境配置与安装
2.1 windows 上配置 nginx
下载地址:http://nginx.org/en/download.html
下载最新稳定版即可,当前为1.16.1。Mainline version属于开发版本。下载后解压即可使用,纯绿色,结构如下图:
双击 nginx.exe 感觉闪动一下,任务管理器中查看进程,会出现两个nginx进程,官方说明是:其中一个进程为主进程,另一个进程为工作进程。
如果未启动,可在错误日志中(logs\error.log)查看原因。如果没有日志信息,需要在windows事件日志中查看原因。一般都是端口占用,或配置文件错误导致。
也可以通过windows控制台,用以下命令对nginx进行管理(路径要切换到nginx所在目录)。
1 start nginx //启动服务(不会出现双进程) 2 nginx -s stop //快速停止服务(强制关闭) 3 nginx -s quit //退出服务 4 nginx -s reload //重新加载(使用新配置重载服务,类似重启) 5 nginx -s reopen //日志分割(开启一个新的日志文件) 6 nginx -t //验证配置文件是否正确
由于是绿色的,基本身也不是为 windows 而写,Nginx 并未对 Windows 提供服务支持。要想做为服务运行,需要借助一个小工具WSW(Windows Service Wrapper)来进行,非关注重点,这里就不细说了。
2.2 linux 安装 nginx(以CentOS 7 为例)
(1) 这里使用EPEL安装(快捷,方便),需要首先安装EPEL仓库,打开终端输入以下命令
sudo yum install epel-release
(2) 安装 nginx,输入安装命令,提示时,回答yes。
sudo yum install nginx
(3) 启动 nginx
sudo systemctl start nginx
浏览器(需要centos有安装界面)上输入localhost,看到下图(用epel安装,就是这张图),表示安装成功了。
如果想外网访问,并且系统有运行防火墙,需要添加 http 和 https 允许通信才可以。可以运行以下命令:
1 sudo firewall-cmd --permanent --zone=public --add-service=http 2 sudo firewall-cmd --permanent --zone=public --add-service=https 3 sudo firewall-cmd --reload
设置系统启动时启动 nginx 服务,运行下命令即可
sudo systemctl enable nginx
到这里就算是搞定了,Nginx 默认安装路径为 /etc/nginx
三、Nginx 反向代理服务配置
以下操作说明,为了方便,都是以windows下为例的。配置文件是在Nginx根目录中,conf 目录下的 nginx.conf 文件。
先来说说网站的事情吧,nginx安装成功后,打开的页面,就相当于可以打开一个站了,是nginx默认配置好的。默认的是只有一个站,像一些虚拟主机(非虚拟机),即一台服务器有多个网站。要实现这个功能,在 nginx 配置也是很简单的。
由于用了同一主机名(都是本地,用的localhost),需要使用不同的端口号,只需要在http模块中,再加入一条 server 项即可,配置如下:
1 server { #这里是默认的server的部分内容,只展示主要的的内容。 2 listen 80; 3 server_name localhost; 4 location / { 5 root html; 6 index index.html index.htm; 7 } 8 #此处省略N项 9 } 10 # 我们自己定义一个server项,这里复制一个nginx根目录中的 html 目录到当前目录,重命名为 html1。 11 # 修改 html1 中的 index.html 中的h1的内容为 welcome to nginx 1! 12 server { 13 listen 8090; 14 location / { 15 root html1; 16 index index.html; 17 } 18 }
重新启动下nginx服务,分别访问 localhost、localhost:8090 即可看到效果。
========================= 50个等号的华丽分割线 =========================
这里进入正题,看看反向代理是如何配置的,挺简单的,一行配置就搞定了,看配置。
server { listen 80; server_name localhost; location / { #root html; #index index.html index.htm; proxy_pass http://localhost:8090; #加入这个配置即可,上面两项要注释掉。 } }
这里直接配置为反向代理上一步中的端口 8090 的站,看一下效果试试。记得要重启 nginx 服务(方便演示,其它的网站也是可以的)
你没看错,就是这么简单的搞定了。HAHA..
四、Nginx 负载均衡配置
负载均衡,Nginx 常用核心功能之一。配置负载均衡,需要用到 upstream 项的配置,废话先不说,直接看配置,如下:
1 upstream myapp { 2 server localhost:8090; 3 server localhost:8080; 4 server localhost:8070; 5 } 6 7 server { 8 listen 80; 9 server_name localhost; 10 location / { 11 proxy_pass http://myapp; #同样用这个配置,指向 upstream 项后面的名称,可自已定义。 12 } 13 } 14 15 # 多定义几个 server 用于负载测试。便于演示,都在一台机上实现了,实际工作中是不可能这样的。 16 server { 17 listen 8090; 18 location / { 19 root html1; 20 #index index.html; #可以不指定,默认就是index.html或index.htm 21 } 22 } 23 24 server { 25 listen 8080; 26 location / { 27 root html2; #nginx 小手一抖,根目录多复制份,改下index.html内容,要有所区别 28 index index.html; 29 } 30 } 31 32 server { 33 listen 8070; 34 location / { 35 root html3; 36 index index.html; 37 } 38 }
重启 nginx 服务,访问 localhost ,多刷新几次,看看效果,是不是每次访问都在改变。这就是最基本的负载算法:轮询算法。
1.轮询算法:每个请求按时间顺序逐一分配到不同的应用服务器,如果应用服务器down掉,自动剔除,剩下的继续轮询。
2.权重算法:通过配置权重,指定轮询机率,权重越大,访问的机率越大。直接在upstream中配置,加在相关服务后面即可,如下:
1 upstream myapp { 2 server localhost:8090 weight=6; 3 server localhost:8080; 4 server localhost:8070; 5 }
3.ip_哈希算法:请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个应用服务器,主要用于解决session共享的问题,其配置如下:
1 upstream myapp { 2 ip_hash; 3 server localhost:8090; 4 server localhost:8080; 5 server localhost:8070; 6 }
4.最少链接:请求转发给连接数较少的应用服务器,能够达到更好的负载均衡效果,就是遍历后端集群,比较每个应用服务的conns/weight,选取该值最小的。其配置如下:
1 upstream myapp { 2 least_conn; 3 server localhost:8090; 4 server localhost:8080; 5 server localhost:8070; 6 }
通过在 upstream 参数中配置不同的选项,可实现不同功能与效果,比如不让某台应用服务参与负载,可配置如下:
1 upstream myapp { 2 server localhost:8090; 3 server localhost:8080; 4 server localhost:8070 down; 5 }
应用服务器后面加上 down 即表示当前的 server 不参与负载。就不会访问这么服务器了。各配置项与功能如下:
a. weight
-权重,即weight越大,负载的权重就越大。
b. down
-表示当前 server 暂时不参与负载。
c. max_fails
-充许请求失败的次数,默认为1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
d. fail_timeout
-max_fails 次失败后,暂停的时间。
e. backup
-其它所有非backup服务器 down 或者忙的时候,请求 backup 服务器。基本上这台服务器压力最轻。
五、各模块配置说明
主要说明下全局配置,events 模块 和 http 模块。
全局配置
1 #user nobody; 2 worker_processes 1; 3 4 #error_log logs/error.log; 5 #error_log logs/error.log notice; 6 #error_log logs/error.log info; 7 8 #pid logs/nginx.pid;
- user 指定nginx worker进程运行用户以及用户组,默认 nobody 账号运行。
- worker_processes 指定nginx开启的子进程数量。在linux中,这个默认值是 auto。可根据情况调整。
- error_log 定义错误日志文件的位置及输出级别(debug / info / notice / warn / error / crit)。默认为crit。
- pid 指定进程id的存储文件位置。
events 模块
1 events { 2 worker_connections 1024; 3 }
- worker_connections 最大可以同时接收的连接数量。值得注意的是,最大连接数量是和 worker_processes 共同决定的。
http模块,这里只说明子模块 server 中的常用配置。upstream 上面说负载均衡时已有说明。
1 server { 2 listen 80; 3 server_name localhost; 4 5 #charset koi8-r; 6 7 #access_log logs/host.access.log main; 8 9 location / { 10 root html; 11 index index.html index.htm; 12 #proxy_pass http://localhost:8080; 13 #proxy_pass http://myapp; 14 } 15 }
- server 一个虚拟主机的配置,一个 http 中可以配置多个 server。
- listen 侦听的端口号
- server_name 主机名,可以是ip地址或者域名,多个配置之间用空格分隔。
- charset 用于设置 location/root 站点的默认编码格式。
- access_log 指定该虚拟主机服务器中的访问记录日志存放路径。
- location 一个非常重要的模块,用于配置路由访问信息。会关联到反向代理,负载均衡等各项功能。
- root 指定web访问的根目录
- index 未指定访问具体资源时,默认展示的文件列表
- proxy_pass 为反向代理的配置,包括负载均衡指向 upstream 模块。
最后,在单独说下 location 这个模块,而且它本身是支持正则的,比如一些静态资源的访问配置,就是通过这里实现的。
location / 即是指匹配访问根目。
location location ~ \.(gif|jpg|png)$ 图片静态资源的匹配,可以指定图片所在目录:
1 location ~ \.(gif|jpg|png)$ { 2 root data/images; 3 }
location ~\.(css|js)$ 匹配css,js文件。一般在做反向代理时,会出现css,js文件无法加载,就可以用到这个:
1 location ~\.(css|js)$ { 2 proxy_pass http://localhost:809; 3 }
指定错误页,也是用的这个
1 error_page 404 /404.html; 2 location = /40x.html { 3 } 4 error_page 500 502 503 504 /50x.html; 5 location = /50x.html { 6 root html; 7 }
六、结语
就说到这里了,只介绍了一些常用的功能及配置,一般情况下也够用了,Nginx 小而精悍,功能也远不止这些,有兴趣的同学,可以深入研究。