目录

一、Nginx功能介绍

1、http正向代理与反向代理

2、负载均衡

3、web缓存

4、动静分离

5、url_hash(第三方)

6、fair(第三方)

二、nginx安装

三、平滑升级nginx

四、nginx基础配置

1、主配置文件

2、用户认证

3、虚拟主机

五、nginx.conf配置文件说明

1、nginx配置结构

2、nginx.conf配置详细说明


一、Nginx功能介绍

1、http正向代理与反向代理

正向代理:

在服务器端想要获取客户端信息时保护客户端,暴露的是代理服务器的地址,隐藏了真实的客户端的地址。

nginx安装测试命令 curl_nginx虚拟主机

 反向代理:

在客户端想要获取服务器端信息时保护服务端,暴露的是代理服务器的地址,隐藏了真实的服务端地址。

nginx安装测试命令 curl_nginx虚拟主机_02

2、负载均衡

 Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,ip_hash。

默认平均轮询RA:

nginx安装测试命令 curl_nginx安装_03

#默认平均轮询RA
#每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
简单配置
  upstream test {
      server localhost:8080;
      server localhost:8081;
  }
  server {
      listen      81;                                                        
      server_name  localhost;                                              
      client_max_body_size 1024M;

      location / {
          proxy_pass http://test;
          proxy_set_header Host $host:$server_port;
      }
  }

加权轮询:

nginx安装测试命令 curl_nginx配置_04

#加权轮询
upstream test {
     server localhost:8080 weight=9;
     server localhost:8081 weight=1;
 }

IP_Hash图如下:

对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。

nginx安装测试命令 curl_nginx配置_05

#IP_HASH示例配置
upstream test {
     ip_hash;
     server localhost:8080;
     server localhost:8081;
 }

3、web缓存

Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。配合着第三方的ngx_cache_purge,对制定的URL缓存内容可以的进行增删管理。

4、动静分离

Nginx提供的动静分离是指把动态请求和静态请求分离开,合适的服务器处理相应的请求,使整个服务器系统的性能、效率更高。Nginx可以根据配置对不同的请求做不同转发,这是动态分离的基础。静态请求对应的静态资源可以直接放在Nginx上做缓冲,更好的做法是放在相应的缓冲服务器上。动态请求由相应的后端服务器处理。
 

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。

#url_hash示例配置
upstream backend { 
    hash $request_uri; 
    hash_method crc32; 
    server localhost:8080;
    server localhost:8081;
}

6、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

#fair示例配置
upstream backend { 
    fair; 
    server localhost:8080;
    server localhost:8081;
}

二、nginx安装

nginx下载地址:nginx: download

yum install gcc pcre-devel openssl-devel -y   #安装基础编译环境
useradd nginx                                 #创建nginx用户
tar -xvf nginx-1.16.1.tar.gz                  #解压
cd nginx-1.16.1

#--prefix为指定安装目录,--user为指定账户名称,--group为指定组名称,--with-http_ssl_module为支持加密功能
#--with-stream为TCP/UDP代理功能的模块,使用Nginx四层代理的时候会用到,--with-http_stub_status_module为开启status状态功能,可以查看nginx连接数等信息
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-stream --with-http_stub_status_module

make && make install                          #编译安装

安装完成会在/usr/local下生成nginx文件,其中:

/usr/local/nginx       #安装目录

conf/nginx.conf      #主配置文件

html                       #网页目录

logs                       #日志文件

sbin/nginx             #服务启动可执行文件

启动nginx服务:

/usr/local/nginx/sbin/nginx

常用选项:

-V :查看编译参数

-c :指定配置文件,启动服务

-t :测试配置文件语法是否有错误

web访问测试,默认80端口,直接浏览器访问ip即可:

nginx安装测试命令 curl_nginx安装测试命令 curl_06

关闭nginx:

/usr/local/nginx/sbin/nginx -s stop

重新加载配置:

/usr/local/nginx/sbin/nginx -s reload

三、平滑升级nginx

tar -xvf nginx-1.18.0.tar.gz  #下载并解压更高版本nginx

cd nginx-1.18.0

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module

make    #不要make install

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old

cp objs/nginx /usr/local/nginx/sbin/

make upgrade    #杀死老版本nginx进程,启动新版本nginx,如果报错也可以手动启动nginx

验证升级后版本:

/usr/local/nginx/sbin/nginx -V

nginx安装测试命令 curl_nginx安装测试命令 curl_07

四、nginx基础配置

1、主配置文件

主配置文件路径:/usr/local/nginx/conf/nginx.conf

#user  nobody;
worker_processes  1;      #启动几个进程,默认是1个进程

#error_log  logs/error.log;               #日志存放位置
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;      #nginx并发量,默认1024
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;          #监听端口
        server_name  localhost;   #域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;         #网站根路径,默认html,是相对路径,即/usr/local/nginx/html
            index  index.html index.htm;   #网站默认首页
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

2、用户认证

设置需要输入用户名密码,才能访问网站,修改主配置文件:

vim /usr/local/nginx/conf/nginx.conf

server {
        listen       80;
        server_name  localhost;
        auth_basic   "auth-domain";                             #密码框提示信息,会显示auth-domain
        auth_basic_user_file   /usr/local/nginx/pass;   #定义用户名和密码存放文件
......
}

yum -y install httpd-tools   
htpasswd -c /usr/local/nginx/pass admin  #创建认证用户admin,用户名可自定义,回车输入密码,-c为create的意思

htpasswd /usr/local/nginx/pass admin2    #也可追加认证用户admin2,注意追加没有-c,如果有-c会覆盖之前的用户

密码为加密存储 :

nginx安装测试命令 curl_nginx配置_08

/usr/local/nginx/sbin/nginx -s reload   #reload重新加载配置文件

web访问:

nginx安装测试命令 curl_nginx安装测试命令 curl_09

3、虚拟主机

虚拟主机可以实现一个nginx提供多个网站的访问

(1)基于域名的虚拟主机

server {

        listen   80;

server_name  web1.tedu.cn;       #域名1

        ...  ...

}


server {

        listen   80;

server_name   web2.tedu.cn;       #域名2

        ... ...

}

(2)基于端口的虚拟主机

server {

listen   8080;                                #端口

server_name  web1.tedu.cn;       #域名

        ...  ...

}


server {

listen   8000;                                 #端口

server_name   web1.tedu.cn;       #域名

        ... ...

}

(3)基于IP的虚拟主机(服务器有多个网卡和IP时)

server {

listen   192.168.1.212:80;                                #端口

server_name  web1.tedu.cn;                          #域名

        ...  ...

}


server {

listen   192.168.1.213:80;                                 #端口

server_name   web1.tedu.cn;                           #域名

        ... ...

}

以基于域名的虚拟主机为例演示:

修改和添加2个server配置:

server {
        listen       80;
        server_name  web1.tedu.cn;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
... ...
}


server {
        listen       80;
        server_name  web2.tedu.cn;

        location / {
            root   web;          #修改根目录为web,以便展示效果,不然还是访问的html相同内容
            index  index.html index.htm;
        }
}

如上图需在/usr/local/nginx下手动创建一个web目录,并拷贝一个index.html首页过去,自定义修改下内容。

/usr/local/nginx/sbin/nginx -s reload    #重新加载配置

客户端测试:如果windows浏览器远程访问,由于没配dns,可以手动加一下hosts文件进行域名解析:

文件路径  C:\Windows\System32\drivers\etc\hosts

nginx安装测试命令 curl_nginx配置_10

 web访问测试:

nginx安装测试命令 curl_nginx安装测试命令 curl_11

五、nginx.conf配置文件说明

1、nginx配置结构

nginx安装测试命令 curl_nginx配置_12

... #全局块 events { #events块 ... } http #http块 { ... #http全局块 server #server块 { ... #server全局块 location [PATTERN] #location块 { ... } location [PATTERN] { ... } } server { ... } ... #http全局块 }

 【释义】:

  1. 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  2. events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  3. http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  4. server块:配置虚拟主机的相关参数,一个http中可以有多个server。
  5. location块:配置请求的路由,以及各种页面的处理情况。

2、nginx.conf配置详细说明

########### 每个指令必须有分号结束。#################

#
#user  nobody;        #设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,示例:#user administrator administrators;  #配置用户或者组,默认为nobody nobody
worker_processes  1;  #worker进程工作数设置,一般来说CPU有几个,就设置几个,或者设置为N-1也行


#error日志设置,语法:error_log  /path/file  level; 当path/file 的值为 /dev/null时,这样就不会输出任何日志了,这也是关闭error日志的唯一手段
#leve的取值范围是debug、info、notice、warn、error、crit、alert、emerg从左至右级别依次增大
#如果设定的日志级别是debug,则会输出所有的日志,这一数据量会很大,需要预先确保/path/file所在的磁盘有足够的磁盘空间。级别设定到debug,必须在configure时加入 --with-debug配置项
#error_log  logs/error.log;     
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;    #设置nginx进程 pid,pid文件(master进程ID的pid文件存放路径)的路径


events {          #events,设置工作模式,默认使用epoll
#仅对指定的客户端输出debug级别的日志: 语法:debug_connection[IP|CIDR]
#这个设置项实际上属于事件类配置,因此必须放在events{……}中才会生效。它的值可以是IP地址或者是CIRD地址。
#debug_connection 10.224.66.14;  #或是debug_connection 10.224.57.0/24
#这样,仅仅以上IP地址的请求才会输出debug级别的日志,其他请求仍然沿用error_log中配置的日志级别。
#注意:在使用debug_connection前,需确保在执行configure时已经加入了--with-debug参数,否则不会生效。

    worker_connections  1024;    #每个worker允许连接的客户端最大连接数
}


http {           #http 是指令块,针对http网络传输的一些指令配置
    include       mime.types;     #include 引入外部配置,提高可读性,避免单个配置文件过大
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '    #设定日志格式,main为定义的格式名称,如此 access_log 就可以直接使用这个变量了,详细参数名,见下方表格
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;   #sendfile使用高效文件传输,提升传输性能。启用后才能使用tcp_nopush,是指当数据表累积一定大小后才发送,提高了效率
    #tcp_nopush     on;

    #keepalive_timeout  0;   #keepalive_timeout设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗
    keepalive_timeout  65;

    #gzip  on;    #gzip启用压缩,html/js/css压缩后传输会更快

    server {     #server可以在http指令块中设置多个虚拟主机,一个server块是一个虚拟主机
        listen       80;     #监听端口
        server_name  localhost;       #域名、监听地址,其后可以跟多个主机名称

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {           #请求路由映射,匹配拦截,
            root   html;       #网页根目录
            index  index.html index.htm;   #首页位置
            #proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
            #deny 127.0.0.1;  #拒绝的ip
            #allow 172.18.5.54; #允许的ip          
        }


        #upstream mysvr {   
        #  server 127.0.0.1:7878;
        #  server 192.168.10.121:3333 backup;  #热备
        #} 
   
        #error_page  404              /404.html;   #404错误页面,可以自定义成:error_page 404 https://www.baidu.com; 

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {         #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

nginx安装测试命令 curl_nginx安装_13