(一) nginx 介绍, 安装,nginx命令,配置,性能优化

四. nginx介绍

apache用的io模型是select
nginx用的是epool
所以nginx优于apache

nginx有商业版和社区版

nginx 是免费,开源,高性能的HTTP和反向代理服务器,邮件代理服务器,通用TCP/UDP代理服务器

解决C10K问题(10K Connections)
官网:http://nginx.org

nginx的其它的二次发行版
Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。

Tengine成为一个开源项目,官网 http://tengine.taobao.org/

OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台,
官网:http://openresty.org/cn/

特性
1.模块化设计,较好的扩展性
2.高可靠性
3.支持热部署不停机更新配置文件,升级版本,更换日志文件
4.低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
5.event-driven,aio,mmap,sendfile

基本功能
1.静态资源的web服务器
2.http协议反向代理服务器
3.pop3/imap4协议反向代理服务器
4.FastCGI(LNMP),uWSGI(python)等协议
5.模块化(非DSO‘动态模块’),如zip,SSL模块

nginx架构

在这里插入图片描述
在这里插入图片描述

nginx的程序架构

web服务相关的功能
虚拟主机(server)
支持 keep-alive 和管道连接( 共享TCP连接发起并发的HTTP请求)
访问日志(支持基于日志缓冲提高其性能)
url rewrite
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
Memcached 的 GET 接口

nginx的程序架构
master/worker结构
不需要线程

  1. 一个master进程:
    负责加载和分析配置文件、管理worker进程、平滑升级

  2. 一个或多个worker进程(与cpu内核相关)
    处理并响应用户请求

  3. 缓存相关的进程:
    cache loader:载入缓存对象
    cache manager:管理缓存对象

nginx模块

nginx高度模块化,但其模块早期不支持DSO机制;1.9.11版本支持动态装载和卸载
在http://nginx.org/en/dosc/下面查看

在这里插入图片描述

模块分类

  1. 核心模块:core module
  2. 标准模块:
    ① HTTP 模块: ngx_http_*
    HTTP Core modules 默认功能
    HTTP Optional modules 需编译时指定
    ② Mail 模块 ngx_mail_*
    ③ Stream 模块 ngx_stream_*
  3. 第三方模块

主要模块
在这里插入图片描述

  1. 核心模块:是 Nginx 服务器正常运行 必不可少 的模块,提供 错误日志记录 、配置文件解析 、 事件驱动机制 、 进程管理 等核心功能
  2. 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
  3. 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全
    协议 SSL 支持等
  4. 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、IMAP 协议和 SMTP协议的支持
  5. 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如:Json 支持、 Lua 支持等

nginx的功功能

有状态:https
无状态:http静态

  1. 静态的web资源服务器
    html,图片,js,css,txt等静态资源
  2. 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
  3. http/https协议的反向代理
  4. imap4/pop3协议的反向代理
  5. tcp/udp协议的请求转发(反向代理)

虚拟主机(server)
支持 keep-alive 和管道连接(利用一个连接做多次请求)
访问日志(支持基于日志缓冲提高其性能)
url rewirte
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程

主进程
读取Nginx 配置文件并验证其有效性和正确性
建立、绑定和关闭socket连接
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置
开启日志文件,获取文件描述符
不中断服务,实现平滑升级,升级失败进行回滚处理
编译和处理perl脚本

工作进程
接受处理客户的请求
将请求以此送入各个功能模块进行处理 IO调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等

nginx的安装

官方yum源:

http://nginx.org/packages/centos/7/x86_64/

官方的nginx的epel源

http://nginx.org/en/linux_packages.html#RHEL-CentOS

首先全装 yum-utils
在这里插入图片描述

在这里插入图片描述

Fedora-EPEL源:

https://mirrors.aliyun.com/epel/7/x86_64/

下载包
http://nginx.org

编译安装

建议编译安装中的参数尽量与之前nginx的参数一样-V

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

useradd -r -s /sbin/nologin nginx -u 2000

tar xvf nginx.tar.gz 

mkdir -p /apps/nginx
chown nginx.nginx /apps/nginx -R

cd nginx/

./configure --prefix=/apps/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--user=nginx --group=nginx --with-http_ssl_module \
--with-http_v2_module --with-http_dav_module \
--with-http_stub_status_module --with-threads --with-file-aio

make && make install

示例

wget 网络
tar xvf 包
useradd -r -s /sbin/nologin nginx -u 2000

chown nginx.nginx /data /apps/nginx -R

./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module

make && make install 

在这里插入图片描述

可以创建软连接

创建一个软连接

ln -s /apps/nginx/sbin/nginx /usr/sbin/

这样就可以用nginx 启动服务
nginx

也可以复制服务脚本

将另一台yum安装的service文件拷贝过来

scp /usr/lib/systemd/system/nginx.service 192.168.245.72:/usr/lib/systemd/system/nginx.service

修改里面的配置

[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid

ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/apps/nginx/sbin/nginx -t
ExecStart=/apps/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target

systemctl daemon-reload 

注意:配置文件
在这里插入图片描述

启动服务systemctl start nginx
一般会直接启用主进程 nginx 来启动服务
在这里插入图片描述

重点------- nginx命令

ls /apps/nginx/
html是测试页,sbin是主程序

ls /apps/nginx/sbin/
nginx 只有一个程序文件

ls /apps/nginx/html/
50x.html index.html 测试网页

nginx:默认为启动nginx

nginx 命令选项:常用

-h 查看帮助选项

-V (大)查看版本和  配置选项(可以用来参考编译安装)
-v 查看版本信息

-t 测试nginx语法错误
-T 详细设置

-c filename 指定配置文件(default: /etc/nginx/nginx.conf)

-s signal 发送信号给master进程,signal:stop, quit, reopen, reload
	示例: nginx -s stop 停止nginx
		  nginx -s reload 加载配置文件
		  
-g directives 在命令行中指明全局指令

常用:这种方式,与systemctl冲突
nginx
nginx -h
nginx -t 修改完配置文件后检查语法
nginx -v
nginx -V
nginx -s stop
nginx -s reload

五. nginx配置

主配置文件:nginx.conf
子配置文件 include conf.d/*.conf

fastcgi, uwsgi,scgi等协议相关的配置文件
mime.types:支持的mime类型

主配置文件的配置指令

 directive value [value2 ...];

注意
(1) 指令必须以分号结尾
(2) 支持使用配置变量
内建变量:由Nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义
set variable_name value;
引用变量:$variable_name

nginx配置文件
在这里插入图片描述

配置文档
http://nginx.org/en/docs/
在这里插入图片描述

主配置文件结构:四部

 main block:主配置段,即全局配置段,对http,mail都有效
 
	 event {
		...
	} 事件驱动相关的配置
	
 http {
		...
} http/https 协议相关配置段

 mail {
	...
} mail 协议相关配置段

stream {
	...
} stream 服务器相关配置段

http协议相关的配置结构


http {
	...
	... 各server的公共配置
	server { 每个server用于定义一个虚拟主机
			...
			}
	server {
		...
		server_name 虚拟主机名
		root 主目录
		alias 路径别名
		location [OPERATOR] URL { 指定URL的特性
			...
			if CONDITION {
			...
			}
		}
	}
}

全局配置

Main 全局配置段常见的配置指令分类
帮助文档
http://nginx.org/en/docs/
http://tengine.taobao.org/nginx_docs/cn/docs/

正常运行必备的配置

  1. user
    指定worker进程的运行身份,如组不指定,默认和用户名同名
    Syntax: user user [group];
    Default: user nobody nobody;
    Context: main
    注意这里:如果有多个不同的nginx服务器
    要让其PID,服务名都一样
useradd -r -s /sbin/nologin nginx -u 2000
  1. pid /PATH/TO/PID_FILE;
    指定存储nginx主进程PID的文件路径

  2. include file | mask; 指明所需的配置文件或者目录
    指明包含进来的其它配置文件片断
    也可以自定义配置文件夹 nginx/conf/conf.d/*.conf
    给主配置文件里面加一个 indlude conf.d/*.conf

  3. load_module file ;
    一般直接用include就可以指定
    模块加载配置文件: /usr/share/nginx/modules/*.conf
    指明要装载的动态模块路径:/usr/lib64/nginx/modules
    在这里插入图片描述

性能优化相关的配置(全局)

  1. worker_processes number | auto;
    worker进程的数量;与cpu个数相匹配
    auto,自动的识别本机的cpu个数

  2. worker_cpu_affinity cpumask …; 也就是绑定cpu和worker进程
    worker_cpu_affinity auto [cpumask] 提高缓存命中率
    CPU绑定

几个cpu写几个0
	CPU MASK: 000000010号CPU
	000000101号CPU
	100000007号CPU

例如有4个cpu
worker_processes=4
worker_cpu_affinity 0001 0010 0100 1000;
worker_cpu_affinity 0101 1010;

在这里插入图片描述

  1. worker_priority number;
    指定worker进程的nice值,设定worker进程优先级:[-20,19]
    默认为0
ps axo pid,cmd,nice |grep nginx

在这里插入图片描述

  1. worker_rlimit_nofile number;
    所有worker进程能打开的文件数量上限,最好与ulimit -n 的值保持一致,如65535
    用测试ab -n1000 -c100 http://192.168.245.72/index.html

事件驱动相关的配置(events中)

在events中设置

 events {
	...
 }
  1. worker_connections #;
    与(worker数量)及ulimit -n值相对应
    每个worker进程所能够打开的最大并发连接数,如10240
    总最大并发数:不能超过ulimit -n的值
    worker_processes * worker_connections
    作为负载均衡时只能设置为最大连接数/CUP

  2. use method; 指定使用的io模型
    指明并发连接请求的处理方法,默认自动选择最优方法
    示例:use epoll; nginx默认为epoll

  3. accept_mutex on | off;
    处理新的连接请求的方法;on由各个worker轮流处理新请求Off指每个新请求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成“惊群”,影响性能,默认值为off,可优化为on

  4. multi_accept on|off;
    此指令默认为off,即默认为一个worker进程只能一次接受一个新的网络连接
    on表示每个woker进程可以同时接受所有新的网络连接(并发性强)

调试和定位问题(全局)

1、daemon on|off;
是否以守护进程方式运行,默认是on,守护进程方式
off 用于调试或docker环境(前台运行)

2、master_process on|off;
是否以master/worker模型运行nginx,默认为on,
off 将不启动worker 测试环境下可以

3、error_log file [level] ;
错误日志文件及其级别;出于调试需要,可设定为debug;但debug

仅在编译时使用了“--with-debug”选项时才有效

/path/logfile: 记录到文件中

stderr: 发送到标准错误

syslog:server-address[,parameter=values] 发送到syslog

memory:size 内存

level:debug|info|notice|warn|error|crit|alter|emerg 日志级别

可以用ab在另一台机子上测试nginx

配置实例

user nginx;
worker_processes  auto;
pid /run/nginx.pid;

events {
    use epoll;
    worker_connections  20480;
    multi_accept on;
    accept_mutex on;
}

stream {
    include sites-enabled/*.stream;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    include       vhosts/*.conf;
    log_format  main  '$remote_addr|$remote_user|[$time_local]|"$request"|'
                      '$status|$body_bytes_sent|$http_host|"$http_referer"|'
                      '"$http_user_agent"|$http_x_forwarded_for|$upstream_cache_status|'
                      '"$upstream_http_content_type"|$request_time|$upstream_response_time|$bytes_sent|$request_length|'
                      '"$upstream_addr"|$uuid|$span_id';

    access_log /data/iuap/logs/nginx/access.log  main;
    error_log /data/iuap/logs/nginx/error.log notice;

    sendfile        on;
    keepalive_timeout  65;

    charset utf-8;
    server_tokens off;
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 800m;
    tcp_nopush on;

    underscores_in_headers on;
    client_body_buffer_size 512k;
    proxy_headers_hash_max_size 51200;
    proxy_headers_hash_bucket_size 6400;
    proxy_connect_timeout 5;
    proxy_read_timeout 60;
    proxy_send_timeout 5;
    proxy_buffer_size 16k;
    proxy_buffers 4 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;
    proxy_temp_path /data/iuap/middleware/nginx/proxy_temp;
    proxy_cache_path /data/iuap/middleware/nginx/proxy_cache levels=1:2 keys_zone=content:20m inactive=1d max_size=100m;
    proxy_cache_path /data/iuap/middleware/nginx/proxy_cache_image levels=1:2 keys_zone=content_image:20m inactive=1d max_size=100m;
    proxy_cache_bypass $http_secret_header;
    proxy_ignore_client_abort on;

    vhost_traffic_status_zone;
    vhost_traffic_status_filter_by_host on;

    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript application/javascript text/css;
    gzip_vary on;

    lua_package_path "/data/iuap/middleware/nginx/lualib/?.lua;;";
    init_by_lua '
        require "resty.core"
        uuid4 = require "uuid4"
    ';

    # include conf.d/*.conf;
    include sites-enabled/*.conf;

    server {
        listen     4040 default;
        access_log off;

        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
            allow 127.0.0.1;
            allow 172.20.46.224;
            allow 172.20.46.78;
            deny all;

        set_by_lua $uuid '
            if ngx.var.http_X_traceId == nil then
                return string.sub(ngx.var.request_id,17,-1)
            else
                return ngx.var.http_X_traceId
            end
        ';

        set_by_lua $span_id '
            if ngx.var.http_X_spanId == nil then
                return ngx.var.uuid
            else
                return ngx.var.http_X_spanId
            end
        ';
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值