nginx基础

210 阅读6分钟

nginx简介

1、Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器

2、常见的应用服务器:

  • Apache/Microsoft IIS

  • Tomcat/Lighttpd/Nginx

image-20200628115824264

常用Web服务器介绍

image-20200628115922510

apache、Nginx、tomcat、weblogic、iis、jboss、websphere、jetty、netty、lighttpd、glassfish

image-20200628115859107

1、Chrome得到html字符串

2、html文本在服务端,通过网络传给chrome

3、服务端,自己临时生成html字符串返回

4、传统it行业:电信/金融 weblogic/jboss/wesphere

5、jboos= ejb + tomcat

6、IIS,c#里。

7、nginx与apache,一层面web服务

nginx主要功能

  • 路由功能(微服务的前端体现)

    image-20200628120059890

  • 2、集群负载功能(横向拓展,提升高并发性能

    image-20200628120201732

  • 3、静态服务器功能

    image-20200628120240946

正想代理与反向代理

正想代理:意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

image-20200628120340509

反向代理:指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

image-20200628120430944

nginx安装

  • wget nginx.org/download/ng…

  • tar -zxvf nginx-1.9.0.tar.gz

  • cd nginx-1.9.0

  • ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

  • make && make install

  • 可能需要:

    yum -y install pcre pcre-devel

    yum -y install zlib zlib-devel

    yum install -y openssl openssl-devel

安装完成后生成

  • Conf 配置文件
  • Html 静态网页文件
  • Logs 日志文件
  • Sbin 二进制程序

Nginx基础概念

image-20200628120811959

一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。

所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。

主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份(user配置项)运行

主进程主要完成如下工作

  1. 读取并验正配置信息;

  2. 创建、绑定及关闭套接字;

  3. 启动、终止及维护worker进程的个数;

  4. 无须中止服务而重新配置工作特性;

  5. 重新打开日志文件;

worker进程主要完成的任务包括:

  1. 接收、传入并处理来自客户端的连接;

  2. 提供反向代理及过滤功能;

  3. nginx任何能完成的其它任务;

发送信号的方式

  • kill -QUIT 进程号 安全停止

  • kil -TERM 进程号 立即停止

停止nginx

./nginx -s stop #停止

./nginx -s quit #退出

./nginx -s reload #重新加载nginx.conf

Nginx信号

1)、TERM、INT 快速关闭

2)、QUIT从容关闭

3)、HUP平滑重启,重新加载配置文件

4)、USR1 重新打开日志文件

5)、USR2 平滑升级可执行程序

KILL 9 强制终止,直接杀

nginx.conf配置文件结构

main(全局设置)

events设定nginx的工作模式及连接数上限

http 服务器相关属性

server(虚拟主机设置)

upstream(上游服务器设置,主要为反向代理、负载均衡相关配置)

location(URL匹配特定位置后的设置)

image-20200628121553101
#user  nobody;  #主模块命令, 指定Nginx的worker进程运行用户以及用户组,默认由nobody账号运行。
worker_processes  1;#指定Nginx要开启的进程数。
worker_rlimit_nofile 100000;  #worker进程的最大打开文件数限制
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
  use epoll;
  worker_connections  1024;
}
  • user :主模块命令, 指定Nginx的worker进程运行用户以及用户组,默认由nobody账号运行。

  • worker_processes: 指定Nginx要开启的进程数。

  • error log:用来定义全局错设日志文件的路径和日志名称。

    日志输出级别有debug,info,notice,warn,error,crit 可供选择,其中debug输出日志最为详细,面crit(严重)输出日志最少。默认是error

  • pid: 用来指定进程id的存储文件位置。

  • event:设定nginx的工作模式及连接数上限,

    其中参数use用来指定nginx的工作模式(这里是epoll,epoll是多路复用IO(I/O Multiplexing)中的一种方式),nginx支持的工作模式有select ,poll,kqueue,epoll,rtsig,/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,对于linux系统,epoll是首选。

  • worker_connection是设置nginx每个进程最大的连接数,默认是1024,所以nginx最大的连接数max_client=worker_processes * worker_connections。进程最大连接数受到系统最大打开文件数的限制,需要设置ulimit。

接下来是http的配置

http {
    include       mime.types;             #  主模块命令,对配置文件所包含文件的设定,减少主配置文件的复杂度,相当于把部分设置放在别的地方,然后在包含进来,保持主配置文件的简洁
    default_type  application/octet-stream; #默认文件类型,当文件类型未定义时候就使用这类设置的。

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '   指定nginx日志的格式
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;
    sendfile        on;   #开启高效文件传输模式(zero copy 方式),避免内核缓冲区数据和用户缓冲区数据之间的拷贝。
    #tcp_nopush     on;   #开启TCP_NOPUSH套接字(sendfile开启时有用)

    #keepalive_timeout  0;   #客户端连接超时时间
    keepalive_timeout  65;

    #gzip  on;             #设置是否开启gzip模块

最后是虚拟主机的配置

server {
        listen       80;  # 虚拟主机的服务端口
        server_name  localhost;  # 用来指定ip或者域名,多个域名用逗号分开
        #charset koi8-r;
        location / {        
               #地址匹配设置,支持正则匹配,也支持条件匹配,这里是默认请求地址,用户可以location命令对nginx进行动态和静态网页过滤处理
            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;
        }     
}

日志

通过访问日志,你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息;

通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。

日志格式

打开nginx.conf配置文件:vi /usr/local/nginx/conf/nginx.conf

日志部分内容:

#access_log logs/access.log main;

日志生成的到Nginx根目录logs/access.log文件,默认使用“main”日志格式,也可以自定义格式。默认main”日志格式: 参数明细表:

$remote_addr 客户端的ip地址(代理服务器,显示代理服务ip)
$remote_user 用于记录远程客户端的用户名称(一般为“-”)
$time_local 用于记录访问时间和时区
$request 用于记录请求的url以及请求方法
$status 响应状态码,例如:200成功、404页面找不到等。
$body_bytes_sent 给客户端发送的文件主体内容字节数
$http_user_agent 用户所使用的代理(一般为浏览器)
$http_x_forwarded_for 可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$http_referer 可以记录用户是从哪个链接访问过来的

日志配置和及切割

  1. 编写切割日志shell

    #!/bin/bash
    #设置日志文件存放目录
    LOGS_PATH=/usr/local/nginx/logs
    #备分文件名称
    YESTERDAY=$(date -d "yesterday" +%Y%m%d%H%M)
    #重命名日志文件
    mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
    mv ${LOGS_PATH}/error.log ${LOGS_PATH}/error_${YESTERDAY}.log
    ## 向 Nginx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件
    kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
    
    
    
  2. 设置Linux定时任务 cron

    0 0 * * * root /usr/local/nginx/logs/nginxLogRotate.sh 
    

Nginx虚拟主机

虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的Intemet服务器功能(WWW、FTP、Email等),同一台主机上的虚拟主机之间是完全独立的。从网站访问者来看,每一台虚拟主机和一台独立的主机完全一样。

利用虚拟主机,不用为每个要运行的网站提供一台单独的Nginx服务器或单独运行一组Nginx进程。虚拟主机提供了在同一台服务器、同一组Nginx进程上运行多个网站的功能。

基于域名的虚拟主机

server {
  #监听端口 80
  listen 80;
  #监听域名abc.com;
  server_name abc.com;
  location / {
    # 相对路径,相对nginx根目录。也可写成绝对路径
    root abc;
    # 默认跳转到index.html页面
    index index.html;
  }
}

基于端口的虚拟主机配置

server {
  listen 2022;
  server_name abc.com;
  location / {
    root /home;
    index index.html;
  }
}

基于IP的虚拟主机配置

server {
  listen 80;
  server_name 192.168.197.142;
  location / {
    root ip;
    index index.html;
  }
}