Nginx

一、介绍

Nginx (engine x) 是一个高性能的轻量级web服务器、反向代理及邮件服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。

官网:www.nginx.org

更多:百度百科

Nginx 特点

稳定、热部署、高并发、响应快、低消耗、分布式支持

内存少,并发能力强

Nginx 发行版本

Nginx 社区免费版: http://tengine.taobao.org/

Nginx 商业版: https://www.nginx.com/

淘宝的tengine: http://tengine.taobao.org/

OpenResty:http://openresty.org/cn/

Nginxy与Apache对比

nginx 相对 apache 的优点:

  • 轻量级,同样起web 服务,比apache 占用更少的内存及资源
  • 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
  • 高度模块化的设计,编写模块相对简单
  • 社区活跃,各种高性能模块出品迅速啊
  • Nginx支持更多的并发连接,能够支持高达50000个并发连接数的相应
  • 能在不间断服务的情况下进行版本升级,能做到不间断运行(7*24)
  • 对静态处理性能高于apache

apache 相对nginx 的优点:

  • rewrite ,比 nginx 的 rewrite 强大
  • 模块超多,基本想到的都可以找到
  • 少bug ,nginx 的bug 相对较多,apache拥有更成熟的技术和开发社区
  • 对动态处理性能高于nginx

两者最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程 .

二、Nginx 安装

①下载源码包

下载地址: https://nginx.org/en/download.html

注意:建议安装稳定版

②编译安装

添加www用户

 useradd -r -s /sbin/nologin www

安装依赖

yum -y install pcre-devel zlib-devel openssl-devel

解压并进入解压目录

tar -xf nginx-1.12.2.tar.gz
cd nginx-1.12.2

配置

./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module
参数作用
--prefix安装路径
--user用于以哪个用户身份安装初始化
--group用于以哪个用户组身份安装初始化
--with-http_ssl_module支持https,需要安装依赖pcel-devel
--with-http_stub_status_module基本状态信息显示,查看请求数、连接数等
--with-http_realip_module定义客户端地址和端口为header头信息,常用于反向代理后的真实IP获取

编译并安装:

 make && make install

③ Nginx 目录

目录作用
conf配置文件
html网站默认目录
logs日志
sbin可执行文件

④配置Systemctl (选做)

注意:需要停掉原来的服务

创建nginx.service

 vim  /usr/lib/systemd/system/nginx.service

编辑文件内容

[Unit]
Description=Nginx Web Server
After=network.target
  
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
  
[Install]
WantedBy=multi-user.target

Type=forking : 后台运行

使用

# 1.启动
systemctl start nginx
# 2.设置开机启动
systemctl enable nginx
# 3.关闭开机启动
systemctl disable nginx
# 4.停止
systemctl stop nginx
# 5.热重载
systemctl reload nginx

三、Nginx 使用

官方文档: http://nginx.org/en/docs/

选项作用
-v软件版本
-V软件版本及所安装的模块(配置选项)
-s发送信号
-t测试配置文件是否有语法错误
-c加载配置文件

更多:# nginx -?

  • nginx -s stop :快速关闭Nginx,立即停止所有请求
  • nginx -s quit :平稳关闭Nginx,所有请求处理完成后,再进行停止。
  • nginx -s reload :热重载,重新加载配置
  • nginx -s reopen :重新打开日志文件。
  • nginx -c filename :为 Nginx 指定一个配置文件

四、Nginx 平滑升级

平滑升级就是不停止现有业务正常使用的前提下,实现Nginx版本的升级

1.思路:

旧的Nginx先不关闭,开启新的Nginx,旧的请求处理完成后就停止旧的进程

Kill:USR2(平滑启动一个新的进程)=》WINCH(关闭旧子进程)=》QUIT(关闭旧主进程)

2.实施:

第一步:

需要确保是使用原生方式启动的Nginx,若没有则重新启动

kill -QUIR (Nginx Master进程PID)
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

第二步:

安装新版本

tar -xf nginx-1.16.1.tar.gz
cd nginx-1.16.1
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module
make && make install

注意:如果有安装第三方模块,切记配置时要加上 --add-module=

第三步:

关闭旧版本,开启新版本

#查看旧版本Nginx Master进程ID
ps -ef|grep nginx
#开启新版本Nginx,但是不关闭旧版本Nginx
kill -USR2 旧版本Nginx Master进程的ID
#关闭旧版本Nginx的worke进程
kill -WINCH 旧版本Nginx Master进程的ID
#关闭旧版本Nginx的Master进程
kill -QUIT 旧版本Nginx Master进程的ID

3.信号参数

#信号参数
TERM,INT (快速退出,直接退出,当前的请求不执行完成退出)
QUIT    (优雅退出,执行完当前的请求后退出)
HUP     (重新加载配置文件,新的配置文件启动新worker进程,并优雅的关闭旧的worker进程)
USR1    (重新打开日志文件)
USR2    (平滑地升级Nginx,开启一个新的主进程,旧主进程不关闭)
WINCH   (优雅地关闭worker进程)

五、配置

1.主配置文件

创建主配置文件

#过滤掉注释行和空行
grep -Ev '#|^$' nginx.conf.default > nginx.conf

修改配置文件

#进程数量,通过设置成和cpu数量相等
worker_processes  1;
events {
    #单个后台worker process进程的最大并发链接数,max:65535
    worker_connections  1024;
}
http {
    #设定mime类型(邮件支持类型),类型由mime.types文件定义
    include       mime.types;
    default_type  application/octet-stream;
    #nginx 是否调用 sendfile 函数来传输文件
    sendfile        on;
    #连接超时时间
    keepalive_timeout  65;
    server {
        #监听端口
        listen       80;
        # 真实域名,localhost代表本机
        server_name  localhost;
        # 项目目录
        root html;
        # 任意请求
        location / {
            # 默认首页
            index  index.html index.htm php.index;
        }
        # 添加PHP文件支持
        location ~ \.php$ {
            #所有的请求交由9000端口的php-fpm进程处理
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        # 错误处理页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

注意:

①每行配置后都需要添加分号;

②为了便于阅读,请规范使用对齐

2.区块配置

方式一:直接修改主配置文件nginx.conf,添加server

    server {
        listen  80;
        server_name www.test.com;
        root test;
        location / {
          index index.html index.htm index.php;
        }
        location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
        }
    }

方法二:

添加子配置文件extra/*.conf,添加server

主配置文件中添加:

include extra/*.conf ;

注意:配置完成后重新加载配置文件

nginx -s reload

注意:

如果使用ThinkPHP或者Laravel框架开发的项目,则必须得把虚拟主机项目目录root指向目录的public目录

3.扩展

基于IP配置不同server

基于端口配置不同server

六、上线商城项目

网站源码下载: http://www.csdeshang.com/home/download/index.html

帮助文档: http://www.csdeshang.com/home/help/article/id/537.html

第一步

下载网站源码并上传至服务器

解压源码,修改目录属主为www

chown -R www.www /www/shop

第二步

修改配置文件 nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  www.shop.com;
        root /www/shop/public;
        location =  / {
          rewrite / /index.php redirect;
        }
        location / {
            index  index.html index.htm index.php;
            if (!-e $request_filename) {
                rewrite ^/index.php/(.*)$ /index.php?s=/$1 last;
                break;
            }
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
     }
    }
}

注意:如果使用ThinkPHP或者Laravel框架开发的项目,则必须得把虚拟主机项目目录root指向目录的public目录

重载服务

nginx -s reload

第三步

测试验证

windows 修改hosts文件

C:\Windows\System32\drivers\etc\hosts
#添加
10.1.1.66 www.shop.com

浏览器访问进行初始化,为了便于测试,初始化时勾选生成测试数据

测试

七、Nginx 模块

1. Gzip 压缩模块

对项目中的文件进行压缩,压缩后文件体积变小,可以提高传输速度,节约带宽,但是压缩会消耗nginxcpu性能

官方文档: http://nginx.org/en/docs/http/ngx_http_gzip_module.html

修改配置文件

http {
    # 开启gzip压缩
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types text/plain text/css text/javascript application/javascript image/jpeg image/gif image/x-ms-bmp;
    gzip_vary off;
    gzip_disable "MSIE [1-6]\.";
    server {}
}
#gzip_min_length : 大于多少才压缩
#gzip_buffers number size :压缩文件时使用的缓存空间的大小,默认128
#gzip_comp_level :压缩级别 1-10
#gzip_types: 进行压缩的文件类型
#gzip_disable :对特定设备不进行压缩,IE6

重启Nginx

nginx -s reload

测试

浏览器 F12
查看资源响应头信息  Content-Encoding:gzip

2. 客户端缓存

为了提高体验效果,可以将一些静态资源缓存在客户端,然后设置过期时间,过期后重新从服务器上获取

location ~ \.(jpg|jpeg|gif|png|js|css)$ {
        expires 7d;
        #expires 30s; //表示把数据缓存30秒
        #expires 30m; //表示把数据缓存30分
        #expires 10h; //表示把数据缓存10小时
        #expires 3d;  //表示把数据缓存3天
        #expires -1;  //表示不缓存
}        

验证

浏览器 F12
查看资源请求头信息  If-Modified-Since 

3. Nginx 代理

正向代理:通过某台机器实现请求,用户能够知道代理服务器的信息,eg:FQ

反向代理:服务器分发代理页面到不同的服务器(Apache,静态服务器),用户并不知道代理服务器的信息,eg:分发请求

LNMPA 实现反向代理

IP主机名描述
10.1.1.31nginx.tigeru.cnNginx
10.1.1.32apache.tigeru.cnApache+PHP

环境准备:略

注意配置hosts文件添加互信

Nginx

配置nginx.conf实现反向代理,把所有的php请求发给apache

http {
    server {
        listen 80;
        server_name localhost;
        location ~ \.php$ {
            # 转发请求到apache + php
            proxy_pass http://10.1.1.32:80;
        }
    }
}

Apache + PHP

#启动httpd
#创建测试页面 
vim /var/www/html/test.php
#添加如下内容
<?php
    echo 'test'
?>

测试

http://10.1.1.31/test.php

4.访问控制

①基于IP 待补充 todo

官方文档: https://nginx.org/en/docs/http/ngx_http_access_module.html

location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all
}
#禁止IP访问  deny  ip  
#允许IP访问  allow ip  

注意:如果同时写allowdeny,要将allow写在上边

②基于用户

基于ngx_http_auth_basic_module实现,一般用作内网

#安装生成密码工具
yum install httpd-tools
#生成密码
htpasswd -c /usr/local/nginx/conf/passd test

编辑配置文件

#修改配置文件
vim /usr/local/nginx/conf/nginx.conf
#编辑
location / {
    ...
    #提示消息
    auth_basic "Welcome";
    #密码文件
    auth_basic_user_file /usr/local/nginx/conf/passd;
}

5.目录显示

当首页文件找不着时,则显示目录结构,测试环境用线上环境不要开启

 localtion / {
     autoindex on;
     index index;
 }

6. Nginx 第三方模块

官方未提供功能,第三方开发者进行开发的模块,开源发布

模块下载: https://www.nginx.com/resources/wiki/modules

HTTP Echo

下载源码包: https://github.com/openresty/echo-nginx-module

 #进入nginx源码包解压路径
 cd nginx-1.12.2
 #配置
 ./configure  --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --add-module=/soft/echo-nginx-module-0.61
 #安装升级
 make && make install && make upgrade

使用

location /hello {
     default_type text/html;
     echo "hello world";
}

八、日志管理

1.访问日志:

访问日志access.log ,用于统计用户的访问及流量信息

默认存放路径:/usr/local/nginx/logs/access.log

#vim /usr/local/nginx/conf/nginx.conf
http {
    ...
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
}
参数描述
$remote_addr客户端IP地址
$remote_user远程客户机名称
$time_local访问时间和时区
$request记录请求的url及请求方法
$status响应状态码
$body_bytes_sent向客户端发送文件主体内容字节数
$http_referer记录用户是从哪个链接访问过来的
$http_user_agent用户所使用的代理,一般为用户所使用的浏览器
$http_x_forwarded_for记录客户端IP

2.错误日志:

错误日志error.log,用于记录配置启动错误信息以及访问请求错误信息

默认存放路径:/usr/local/nginx/logs/error.log

#vim /usr/local/nginx/conf/nginx.conf
http {
    ...
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
}

错误级别

debug(用于调试,记录的内容丰富), info, notice, warn, error, crit(默认)

3.日志轮转

创建日志切割脚本文件,通过计划任务进行日志轮转

touch /usr/local/nginx/logs/logrotate.sh
chmod +x /usr/local/nginx/logs/logrotate.sh

脚本内容如下:

#!/bin/bash
date_info=$(date +%F-%H:%M)
#分割日志
mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access.log.$date_info 
#重载Nginx
/usr/local/nginx/sbin/nginx -s reload

创建计划任务,每六小时进行一次切割

crontab -e

* */6 * * * /bin/sh /usr/local/nginx/logs/logrotate.sh &>/dev/null

九、location

根据用户请求的uri来执行不同的操作,匹配的内容为域名往后的uri

官方文档: http://nginx.org/en/docs/http/ngx_http_core_module.html#location

1.语法:

location [ = | ~ | ~* | ^~ ] uri { ... }

2.匹配规则

#1.匹配任意连接
location / { ... }
#2.匹配首页
location =/ { ... }
#3.精确匹配
location =/test { ... }
#4.大小写敏感匹配
location ~ /test { ... }
#5.忽略大小写匹配
location ~* /test { ... }
#6.以什么开头
location ^~ /img/ { ... }
#7.以什么结尾
location ~ \.jpg$ { ... }

注意:一个server中不能出现两个相同的匹配规则

3.测试

location ~ \.jpg$ {
    default_type text/html;
    echo ""
}
#注意需要安装第三方模块 HTTP Echo 

4. location 优先级

#1.优先级最高
location = / { ... }
#2.优先匹配
location ^~ /images/ { ... }
#3.不区分大小写匹配网站资源
location ~* \.(gif|jpg|jpeg|png) { ... }
#4.根据资源目录进行匹配
location /documents/ { ... }
#5.所有匹配不满足时,匹配默认的location /
location / { ... }

十、return与rewrite

1. return

用于返回响应状态码

常见状态码:

#200 OK,请求成功,正常响应
#301 Moved Permanently,永久重定向,常用于重写规则
#302 Found,临时重定向,常用于重写规则
#304 Not Modified,请求资源内容没有改变,常用于缓存
#404 Not Found,代表请求资源不存在,文件或路径不存在
#500 Internal Server Error,服务器遇到了不知道如何处理的情况,常见于代码异常
#503 Service Unavailable,服务器没有准备好处理请求。常见于服务器因维护或重载而停机

用法

return 状态码

2. rewrite

重写规则

rewrite 匹配内容 替代内容 flag标记;

flat标记

# last      | 本条规则匹配完成后,继续向下匹配新的规则             
# break     | 本条规则匹配完成即终止,不再匹配后面的任何规则       
# redirect  | 返回302临时重定向,浏览器地址会显示跳转后的URL地址   
# permanent | 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 

注意:

last与break,进行重定向时,其客户端URL地址不会改变。
redirect与permanent,进行重定向时,其客户端URL地址会发生改变。

案例1:资源重定向(伪静态)

location / {
    index index.html index.htm;
    rewrite / /index.php last;
     #rewrite / /index.php redirect;
}
# last     :客户端显示效果: /www.domainname.com/
# redirect :客户端显示效果: /www.domainname.com/index.php

案例2:域名重定向

将所有的请求转发到新的域名上,客户端url地址进行改变

server {
    listen 80;
    server_name www.tigeru.com;
    rewrite / http://www.tiger.com permanent;
}

案例3:防盗链

实现原理:通过判断referer来源,来设置是否返回的资源文件

location \.(jpg|jpeg|gif|png)$ {
    valid_referers 绑定域名;
    if ($invalid_referer) {
        return 404;
        # 返回图片
        # rewrite ^/ http://www.tigeru.img/uri..
    }
}

3. PATHINFO

案例:

location / {
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php?s=/$1 last;
    }
}
# (1) http://www.tigeru.com/index.php/news/sport/3.html
# (2) http://www.shop.com/index.php?s=news/sport/3.html
# 实现效果把uri(1)替换为(2)

十一、Nginx 安全设置

1.反向代理

隐藏真实服务器

2.隐藏版本信息

http {
    server_tokens off;
}

3. CA 证书

httpshttp的一个加密协议,基于ssl套接字,把传输的信息进行加密。默认端口443

其他

curl

查看一个网站所采用web server

curl -I  域名

elinks

查看网页显示

yum install elinks
elinks -dump http://10.1.1.31

并发统计

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'

结果说明

SYN_RECV        //一个连接请求已经到达,等待确认
ESTABLISHED     //正常数据传输状态/当前并发连接数
FIN_WAIT2       //另一边已同意释放
ITMED_WAIT      //等待所有分组死掉
CLOSING         //两边同时尝试关闭
TIME_WAIT       //另一边已初始化一个释放
LAST_ACK        //等待所有分组死掉
Last modification:January 19th, 2020 at 05:25 pm