Nginx笔记

Nginx

什么是Nginx?

  • Nginx(engine x)是一个高性能的HTTP和反向代理web服务器,同时也提供IMAP/POP3/SMTP服务。
  • 主要功能 ------ 反向代理
  • 通过配置文件可以实现集群和负载均衡
  • 静态资源虚拟化

常见的web服务器

  • MS IIS asp.net
  • Weblogic、Jboss 传统行业 ERP、物流、电信、金融
  • Tomcat、Jetty J2EE
  • Apache、Nginx 静态服务、反向代理
  • Netty 高性能服务器编程

什么是正向代理

  • 客户端请求目标服务器之间的一个代理服务器。
  • 请求会先经过代理服务器,然后再转发请求到目标服务器,获得内容后最后响应给客户端。

什么是反向代理

  • 用户请求目标服务器,由代理服务器决定访问那个ip

安装和运行

1、 官网http://nginx.org/ 下载对应的nginx包
2、 上传nginx到linux服务器
3、 安装依赖环境
1. 安装gcc环境
* yum install gcc-c++
2. 安装PCRE库,用于解析正则表达式
* yum install -y pcre pcre-devel
3. 安装zlib压缩和解压缩依赖
* yum install -y zlib zlib-devel
4. SSL安全的加密的套接字协议层,用于HTTP安全传输,也就是https
* yum install -y openssl openssl-devel
4、 解压,需要注意,解压后得到的是源码,需要编译后才能安装
* tar -zxvf nignx-1.16.1.tar.gz
5、编译之前,先创建nginx临时目录,如果不创建,在启动nignx的过程中会报错
* mkdir /var/temp/nginx -p
6、在nginx目录,输入如下命令进行配置,目的是为了创建makefile文件

./configure \
--prefix=/usr/loacl/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \

Nginx笔记_第1张图片
Nginx笔记_第2张图片
7、make编译
* make
8、安装
* make install
9、进入sbin目录启动nginx
* ./nginx
* 停止 ./nignx -s stop
* 重新加载 ./nignx -s reload
* 检测配置文件 ./nginx -t
10、打开浏览器,访问服务器内网ip即可打开nginx默认页面

注意事项:

  • 需要开启nginx默认的80端口

Nginx的进程模型

  • master进程:主进程
  • worker进程:工作进程

主进程只有一个,工作进程默认只有一个,可以在配置文件中进行修改。

#user  nobody;
worker_processes  1;

Nginx笔记_第3张图片

例如,操作人发送停止信号,master令worker执行,此时worker1、worker2是没有客户端连接的,worker1、worker2立即停止;但worker3此时有客户端请求连接,worker3不会立刻停止,会等到客户端连接关闭,也就是请求处理完成之后,再做停止。

Nginx处理Web请求处理机制

  • worker抢占机制
    Nginx笔记_第4张图片

如图,当一个master进程fork了3个worker进程,当一个客户端请求进入,三个worker进程会对互斥锁(accept_mutex)进行抢占,抢到的worker与client建立关系,处理请求。

  • 传统服务器事件处理

Nginx笔记_第5张图片

当client1阻塞住后,client2、client3需要等待client1响应结束。

Nginx笔记_第6张图片

为了解决这种方式,master会fork一个新的worker2进程,client2、client3会被worker2接受请求处理响应,如果client2也阻塞住,master再fork一个新的worker3进程,client3被worker3接受请求处理响应。(同步阻塞)

缺点:性能较低,当并发达到几十万、几百万之后,服务器需要开很多进程处理很多客户端,如果都是阻塞的情况下,对服务器资源开销是十分大的。

  • Nginx事件处理
    Nginx笔记_第7张图片

当client1阻塞时,此时又有client2、client3请求worker1,由于nginx是异步非阻塞的(多路复用器),所以worker1可以在处理时发现client1被阻塞,就会继续处理client2,如果client2也被阻塞,他会继续处理client3。

这主要是因为worker1可以在配置文件中设置,use epoll,linux上默认是epoll,nginx会根据不同的操作系统使用不同的工作模式,如果是windows或者mac os,epoll是需要设置的。

epoll如果使用之后,一个worker可以处理差不多6~8万个请求,并发高,并且worker处理请求数量是和cpu、内存相关的。

对比传统的服务器模型,传统服务器可能会fork出很多个worker进程,但是nginx的worker进程会很少。所以nginx的性能是非常高的。

nginx.conf

events {
    # 默认使用epoll
    use epoll;
    # 每个worker允许连接的客户端最大连接数
    worker_connections  1024;
}

nginx.conf 配置结构

  • main 全局配置
  • event 配置工作模式以及连接数
  • http http模块相关配置
    • server 虚拟主机配置(服务器) 可以多个
      • location 路由规则 表达式
      • upstream 集群,内网服务器,负载均衡规则
    • server
# 操作worker的用户  默认是nobody
user  root;
# 开启worker进程数量 默认是1  
#(与CPU相关 CPU有几个 worker就可以是几 如果有其他中间件: 可以为 worker_processes=n-1)
worker_processes  1;

# nginx日志配置 日志级别: debug、info、notice、warn、error、crit
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# nginx进程号文件
#pid        logs/nginx.pid;

events {
    # 默认使用epoll
    use epoll;
    # 每个worker允许连接的客户端最大连接数
    worker_connections  1024;
}


http {
    # 包含导入外部文件 mime.types 提高可读性
    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"';

    # 所有http请求会记录在access.log文件中
    #access_log  logs/access.log  main;

    # 文件传输性能提升   on 打开
    sendfile        on;
    # 需要和sendfile一起使用,当sendfile为on,当数据包累计到一定大小后,再进行发送
    #tcp_nopush     on;

    # 客户端连接超时时间,默认为0,单位是秒;
    keepalive_timeout  65;

    # 压缩,像html、css、js经过压缩后传输,提升传输效率,但是消耗CPU资源
    #gzip  on;

    # 虚拟服务器
    server {
        # 监听端口号
        listen       80;
        # 监听ip/域名
        server_name  localhost;

        # 路由
        location / {
            root   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;
         }
       }
    }
}

user nobody;

Nginx常用命令解析

./nginx -s stop         快速停止Nginx (暴力关闭)
./nginx -s quit         停止Nginx  (针对Http请求,如果有用户连接会维持用户连接,直到客户连接断开,关闭Nginx)
./nginx -t              检查配置文件
./nginx -v              展示Nginx版本号
./nginx -V              展示Nginx具体信息
./nginx -h              帮助命令
./nginx -c              (切换)指定Nginx配置文件
./nginx -s reload       重新读取配置文件

Nginx日志文件切割 手动

1、创建一个shell的可执行文件 cut_my_log.sh

#!/bin/bash
# 日志文件路径
LOG_PATH="/var/log/nginx/"
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
# pid文件路径
PID=/var/run/nginx/nginx.pid
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log

#向Nginx主进程发送信号,用于重新打开日志文件
kill -USR1 `cat $PID`

2、为cut_my_log.sh添加可执行的权限:

chmod +x cut_my_log.sh

3、测试日志切割后的结果:

./cut_my_log.sh

Nginx日志文件切割 定时

1、安装定时任务

yum install crontabs

2、crontab -e 编辑并添加一行新的任务

*/1 * * * * /usr/local/nginx/sbin/cut_my_log.sh

3、重启定时任务

service crond restart
  • 附: 常用定时任务命令
service crond start       //启动服务
service crond stop        //关闭服务
service crond restart     //重启服务
service crond reload      //重新载入配置
crontab -e                //编辑任务
crontab -l                //查看任务列表

使用Nginx为静态资源提供服务

Nginx笔记_第8张图片
静态资源别名
Nginx笔记_第9张图片

你可能感兴趣的:(中间件知识,nginx)