Nginx 安装、配置及相关介绍

一、前言

  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 112 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 小而精悍,功能也远不止这些,有兴趣的同学,可以深入研究。

posted @ 2019-09-25 18:04  快乐泥巴  阅读(...)  评论(... 编辑 收藏