NGIXN重学—基础知识

192 阅读7分钟

这是我参与更文挑战的第13天,活动详情查看: 更文挑战

1, 前话

NGINX是一个高性能的HTTP和方向代理web服务器,同时也提供了IMAP/POP3/SMTP 等邮件服务。其特点是占用内存少,并发能力强,事实上NGINX的并发能力在同类型的网页服务器中表现较好,NGINX是一个安装非常简单,配置文件非常简洁,BUG非常少的服务,NGINX启动特别容易,并且基本上可以做到7*24不间断运行,即使运行数月也不需要重新启动,官方测试表明能够支持高达5000个并发连接响应。

2, NGINX作用

HTTP 代理, 方向代理: 作为web服务器 最常用的功能之一, 负载均衡

正向代理:简单理解,代理客户端请求,像VPN, 翻墙

反向代理:简单理解,代理服务器端

负载均衡: nginx提供两种策略进行负载均衡:

内置策略: 轮询,加权轮询,IP Hash
扩展策略: 天马行空,只有你想不到的没有他做不到的

动静分离: 有些页面,需要后端请求,返回动态网页,也有些不需要经过后端处理的文件,这部分文件是静态文件,根据一定的规则,把不变的资源和经常变的资源区分开,提高资源响应速度。

3, NGINX的优点

(1)速度更快,并发更高

(2)配置简单,扩展性强

(3)高可靠性

NGINX采用的是多进程模式运行,其中一个master主进程和N多个worker进程,worker进程的数量我们可以手
动设置,每个worker进程之间都是相互独立提供服务,并且master主进程可以在某一个worker进程出错时,快
速创建新的worker进程提供服务

(4)热部署

NGINX可以7*24小时提供服务,可以在NGINX不停止的情况下,对NGINX进行文件升级,更新配置和更换日志文件

(5)成本低,BSD许可证

BSD是一个开源的许可证,NGINX本身是开源的,我们不久可以免费的将NGINX应用在商业领域,还可以在项目中
直接修改NGXIN的源码

4, NGINX常用模块

1, 静态资源部署
2,Rewrite地址重写
3,正则表达式
4,方向代理
5,负载均衡: 轮询,ip_hash, url_hash, fair
6, web缓存
7, 环境部署,热更新,
8, 用户认证模块

NGXIN的核心组成

nginx: 二进制文件
nginx.conf  配置文件
error.log.  错误日志
access.log  访问日志记录

5, NGINX 安装

# 安装nginx所需的环境
yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

1, 查看,卸载

whereis nginx
如果存在:
rm -rf /usr/sbin/nginx

如果是yum安装的
yum remove nginx

2, 源码安装

# 找到官网需要下载的版本,右键复制下载链接地址
wget http://nginx.org/download/nginx-1.20.1.tar.gz

# 创建文件夹,把下载的压缩包copy过去
mkdir -p nginx/core
mv nginx-1.20.1.tar.gz nginx/core

# 解压缩
tar -xzf nginx-1.16.1.tar.gz

# 进入资源文件,找到configure
./configure

# 编译
 make
 
# 安装
 make install

# 查找安装的nginx目录位置
 whereis nginx

3,yum安装

# 安装yum-utils
yum install yum-utils
# 添加yum源文件, 打开下面的配置文件,添加配置
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
# 最后安装nginx
yum install -y nginx

6, NGINX目录分析

1, 安装tree工具

yum install -y tree

2, 查看nginx目录结构

tree /usr/local/nginx

3, 配置分析

# 访问日志查看
tail -f nginx/logs/access.log

# error 日志查看
tail -f nginx/logs/error.log

# 主要的配置
 nginx.conf
# 可执行文件
 sbin/nginx

7, NGINX 命令

1, NGXIN 服务的信号控制

# 查看当前服务是否有nginx进程
 ps -ef | grep nginx

# 查看nginx对应的PID
 通过ps -ef | grep nginx 执行,显示的 master 进程的ID就是PID
 master 进程控制着多个worker进程
信号作用
TERM立刻关闭整个服务
QUIT优雅的关闭整个服务(处理完当前的请求,不在接受新的请求)
HUP重读配置文件
WINCH所有子进程不在接受处理新链接
USR2平滑升级到最新版本的NGINX

对应的命令:signal就是上面的信号单词

PID就是master的进程ID

kill -signal PID

kill -QUIT 123459

2, NGINX命令行控制

进入  cd /usr/local/nginx/sbin

# 帮忙查看
 ./nginx -h
# 版本
 ./nginx -v
# 配置文件验证
 ./nginx -t
 
# 启动nginx服务
./nginx
# 停止NGINX服务
 ./nginx -s stop
# 退出
 ./nginx -s quit
# 重新加载
./nginx -s reload

8, NGINX 核心配置文件

默认情况,核心配置文件在: /usr/local/nginx/nginx.conf, 很多注解是参考网上各位大神的理解

nginx.conf配置文件中默认的三大块: 全局块, events快, http快
http块中可以配置多个server块,每个server块有可以配置多个locaton快
#定义Nginx运行的用户和用户组, 可查看静态文件所属的用户组
user www www;

#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;
 
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /usr/local/nginx/logs/error.log info;

#进程pid文件
pid /usr/local/nginx/logs/nginx.pid;

#指定进程可以打开的最大描述符:数目
#工作模式与连接数上限
worker_rlimit_nofile 65535;

events
{
    #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; 
    #是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,
    use epoll;
    #单个进程最大连接数(最大连接数=连接数*进程数)
    #理论上每台nginx服务器的最大连接数为。
    worker_connections 65535;
    #keepalive超时时间。
    keepalive_timeout 60;

    #客户端请求头部的缓冲区大小。
    client_header_buffer_size 4k;

    #为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,
    #inactive是指经过多长时间文件没被请求后删除缓存。
    open_file_cache max=65535 inactive=60s;

    #这个是指多长时间检查一次缓存的有效信息。
    open_file_cache_valid 80s;
    open_file_cache_min_uses 1;
    open_file_cache_errors on;
}
 
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http
{
    #文件扩展名与文件类型映射表
    include mime.types;
    #默认文件类型
    default_type application/octet-stream;
    #默认编码
    #charset utf-8;

    #服务器名字的hash表大小
    server_names_hash_bucket_size 128;
    #客户端请求头部的缓冲区大小
    client_header_buffer_size 32k;
    #客户请求头缓冲大小。
    large_client_header_buffers 4 64k;
    #设定通过nginx上传文件的大小
    client_max_body_size 8m;
    #开启高效文件传输模式,
    sendfile on;
    #开启目录列表访问,合适下载服务器,默认关闭。
    autoindex on;
    #此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
    tcp_nopush on;
    tcp_nodelay on;
    #长连接超时时间,单位是秒
    keepalive_timeout 120;
    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    #gzip模块设置
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k;    #最小压缩文件大小
    gzip_buffers 4 16k;    #压缩缓冲区
    gzip_http_version 1.0;    #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2;    #压缩等级
    gzip_types text/plain application/x-javascript text/css application/xml;  
    gzip_vary on;

    #负载均衡配置
    upstream jsbbmm.top.cn {
    
        #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。
        # weigth参数表示权值,权值越高被分配到的几率越大。
        server 192.168.80.121:80 weight=3;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 weight=3;    
    }
               
    #虚拟主机的配置
    server
    {
        #监听端口
        listen 80;

        #域名可以有多个,用空格隔开
        server_name www.w3cschool.cn w3cschool.cn;
        index index.html index.htm index.php;
        root /data/www/w3cschool;

        #对******进行负载均衡
        location ~ .*.(php|php5)?$
        {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
         
        #图片缓存时间设置
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires 10d;
        }
         
        #JS和CSS缓存时间设置
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
         
        #日志格式设定    
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';
         
        #定义本虚拟主机的访问日志
        access_log  /usr/local/nginx/logs/host.access.log  main;
        access_log  /usr/local/nginx/logs/host.access.404.log  log404;
         
        #对 "/" 启用反向代理
        location / {
            proxy_pass http://127.0.0.1:88;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
             
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             
            #以下是一些反向代理的配置,可选。
            proxy_set_header Host $host;

            #允许客户端请求的最大单文件字节数
            client_max_body_size 10m;

            client_body_buffer_size 128k;

            #表示使nginx阻止HTTP应答代码为400或者更高的应答。
            proxy_intercept_errors on;

            #后端服务器连接的超时时间_发起握手等候响应超时时间
            #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_connect_timeout 90;
            
            #后端服务器数据回传时间(代理发送超时)
            proxy_send_timeout 90;
            
            #连接成功后,后端服务器响应时间(代理接收超时)          
            proxy_read_timeout 90;

            #设置代理服务器(nginx)保存用户头信息的缓冲区大小          
            proxy_buffer_size 4k;

            #proxy_buffers缓冲区,网页平均在32k以下的设置 
            proxy_buffers 4 32k;
            
            #高负荷下缓冲大小(proxy_buffers*2)
            proxy_busy_buffers_size 64k;
            
            #设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
            proxy_temp_file_write_size 64k;
        }             
        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file confpasswd;
            #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
        }         
        #本地动静分离反向代理配置
        #所有jsp的页面均交由tomcat或resin处理
        location ~ .(jsp|jspx|do)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8080;
        }         
        #所有静态文件由nginx直接读取不经过tomcat或resin
        location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|
        pdf|xls|mp3|wma)$
        {
            expires 15d; 
        }
         
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
    }
}

9, 总结

学习是一个不断巩固的过程,很多配置和理解,还需要自己在实战中不断摸索,有些知识够用即可,当需要的时候,可以立刻进入高效状态,