侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

Nginx(一):基础与配置文件简介

2023-11-13 星期一 / 0 评论 / 0 点赞 / 52 阅读 / 21296 字

Nginx(一):基础与配置文件简介 简介:   Nginx是一款由俄罗斯程序员Igor Sysoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。Nginx是

Nginx(一):基础与配置文件简介

简介:   Nginx是一款由俄罗斯程序员Igor Sysoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。与旧版本(<=2.2)的Apache不同,nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑,削减了上下文调度开销,所以并发服务能力更强。整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。整体采用模块化设计是nginx的一个重大特点,甚至http服务器核心功能也是一个模块。要注意的是:nginx的模块是静态的,添加和删除模块都要对nginx进行重新编译,这一点与Apache的动态模块完全不同。

基本功能:

  静态资源的web服务器,能缓存打开的文件描述符;

  反向代理服务器,缓存、负载均衡;

  支持FastCGI

  模块化,非DSO机制,过滤器gzip,SSI和图像大小调整等

  支持SSL

扩展功能:

  基于名称和IP做虚拟主机

  支持keepalive

  支持平滑配置更新或程序版本升级

  定制访问日志,支持使用日志缓存以提高性能

  支持url rewrite

  支持路径别名

  支持基于IP及用户的认证;

  支持速率限制,并发限制等;

nginx的基本架构:

  一个master进程,生成一个或多个worker进程

  事件驱动:kqueue(Freebsd),epoll(Linux),/dev/poll(Sun)

  消息通知:select,poll,rt signals

  支持sendfile,sendfile64

  文件AIO

  支持mmap

  nginx:非阻塞、事件驱动、一个master多个worker,一个worker响应多个用户请求;

nginx的模块类别:

  Nginx core module:nginx的核心模块

  Standard HTTP modules:nginx的标准模块

  Optional HTTP modules:nginx的可选模块

  Mail modules:nginx的邮件模块

  3rd party modules:nginx的第三方模块

nginx相对apache的优点:

  轻量级,同样起web 服务,比apache占用更少的内存及资源

  抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能

  高度模块化的设计,编写模块相对简单

  社区活跃,各种高性能模块出品迅速啊

apache 相对nginx 的优点:

  rewrite ,比nginx 的rewrite 强大

  模块超多,基本想到的都可以找到

  少bug ,nginx 的bug 相对较多

  超稳定

编译安装:

官方网站:http://nginx.org/

安装开发环境,并解决软件依赖关系:

[root@node0 ~]# yum groupinstall "Development Tools" "Server Platform Deveopment"[root@node0 ~]# yum install pcre-devel zlib-devel

创建nginx用户和nginx组:

[root@node0 ~]# groupadd -r nginx[root@node0 ~]# useradd -g nginx -r nginx

编译安装:

[root@node0 ~]# tar xf nginx-1.8.0.tar.gz[root@node0 ~]# cd nginx-1.8.0/[root@node0 nginx-1.8.0]# ./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/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/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/usr/local/nginx/client/ --http-proxy-temp-path=/usr/local/nginx/proxy/ --http-fastcgi-temp-path=/usr/local/nginx/fcgi/ --http-uwsgi-temp-path=/usr/local/nginx/uwsgi --http-scgi-temp-path=/usr/local/nginx/scgi --with-pcre[root@node0 nginx-1.8.0]# make && make install

选项解释:

--prefix=/usr/local/nginx    //:nginx安装目录--sbin-path=/usr/sbin/nginx    //:可执行命令路径--conf-path=/etc/nginx/nginx.conf    //:默认配置文件路径--pid-path=/var/run/nginx.pid    //:pid文件路径--lock-path=/var/lock/nginx.lock    //:lock文件路径--http-log-path=/var/log/nginx/access.log    //:访问日志路径--error-log-path=/var/log/nginx/error.log    //:报错日志路径--user=nginx    //:运行用户--group=nginx    //:运行组--with-http_ssl_module    //:启用ssl模块--with-http_flv_module    //:启用flv模块--with-http_stub_status_module    //:启用可监控服务状态页--with-http_gzip_static_module    //:启用压缩传输--with-pcre    //:支持pcre库,增强的正则表达式分析工具--http-client-body-temp-path=/usr/local/nginx/client/    //:http请求实体临时文件路径--http-proxy-temp-path=/usr/local/nginx/proxy/    //:http代理临时文件路径--http-fastcgi-temp-path=/usr/local/nginx/fcgi/    //:http_fastcgi临时文件路径--http-uwsgi-temp-path=/usr/local/nginx/uwsgi    //:http_uwsgi临时文件路径--http-scgi-temp-path=/usr/local/nginx/scgi    //:http_scgi临时文件路径

提供服务启动脚本:

[root@node0 nginx]# cat /etc/rc.d/init.d/nginx#!/bin/sh## nginx - this script starts and stops the nginx daemon## chkconfig:   - 85 15# description:  NGINX is an HTTP(S) server, HTTP(S) reverse /#               proxy and IMAP/POP3 proxy server# processname: nginx# config:      /etc/nginx/nginx.conf# config:      /etc/sysconfig/nginx# pidfile:     /var/run/nginx.pid# Source function library.. /etc/rc.d/init.d/functions# Source networking configuration.. /etc/sysconfig/network# Check that networking is up.[ "$NETWORKING" = "no" ] && exit 0nginx="/usr/sbin/nginx"prog=$(basename $nginx)NGINX_CONF_FILE="/etc/nginx/nginx.conf"[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginxlockfile=/var/lock/subsys/nginx.lockmake_dirs() {   # make required directories   user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=/([^ ]*/).*//1/g' -`   if [ -z "`grep $user /etc/passwd`" ]; then       useradd -M -s /bin/nologin $user   fi   options=`$nginx -V 2>&1 | grep 'configure arguments:'`   for opt in $options; do       if [ `echo $opt | grep '.*-temp-path'` ]; then           value=`echo $opt | cut -d "=" -f 2`           if [ ! -d "$value" ]; then               # echo "creating" $value               mkdir -p $value && chown -R $user $value           fi       fi   done}start() {    [ -x $nginx ] || exit 5    [ -f $NGINX_CONF_FILE ] || exit 6    make_dirs    echo -n $"Starting $prog: "    daemon $nginx -c $NGINX_CONF_FILE    retval=$?    echo    [ $retval -eq 0 ] && touch $lockfile    return $retval}stop() {    echo -n $"Stopping $prog: "    killproc $prog -QUIT    retval=$?    echo    [ $retval -eq 0 ] && rm -f $lockfile    return $retval}restart() {    configtest || return $?    stop    sleep 1    start}reload() {    configtest || return $?    echo -n $"Reloading $prog: "    killproc $nginx -HUP    RETVAL=$?    echo}force_reload() {    restart}configtest() {  $nginx -t -c $NGINX_CONF_FILE}rh_status() {    status $prog}rh_status_q() {    rh_status >/dev/null 2>&1}case "$1" in    start)        rh_status_q && exit 0        $1        ;;    stop)        rh_status_q || exit 0        $1        ;;    restart|configtest)        $1        ;;    reload)        rh_status_q || exit 7        $1        ;;    force-reload)        force_reload        ;;    status)        rh_status        ;;    condrestart|try-restart)        rh_status_q || exit 0            ;;    *)        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"        exit 2esac

启动服务:

[root@node0 nginx]# chmod +x /etc/rc.d/init.d/nginx[root@node0 nginx]# chkconfig nginx --add[root@node0 nginx]# chkconfig nginx on[root@node0 nginx]# service nginx start

测试访问:

nginx主配置文件支持vim高亮:

下载nginx.vim:http://www.vim.org/scripts/script.php?script_id=1886

[root@node0 ~]# mkdir -p ./.vim/syntax[root@node0 ~]# cp nginx.vim ./.vim/syntax/[root@node0 ~]# vim ./.vim/filetype.vimau BufRead,BufNewFile /etc/nginx/* if &ft == '' | setfiletype nginx | endif

配置文件详解:

  Nginx的代码是由一个核心和一系列的模块组成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地进行交互。不过,大多跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的。这些功能模块大致可以分为事件模块、阶段性处理器、输出过滤器、变量处理器、协议、upstream和负载均衡几个类别,这些共同组成了nginx的http功能。事件模块主要用于提供OS独立的(不同操作系统的事件机制有所不同)事件通知机制如kqueue或epoll等。协议模块则负责实现nginx通过http、tls/ssl、smtp、pop3以及imap与对应的客户端建立会话。

  Nginx的核心模块为Main和Events,此外还包括标准HTTP模块、可选HTTP模块和邮件模块,其还可以支持诸多第三方模块。Main用于配置错误日志、进程及权限等相关的参数,Events用于配置IO模型,如epoll、kqueue、select或poll等,它们是必备模块。

  Nginx的主配置文件由几个段组成,这个段通常也被称为nginx的上下文,每个段的定义格式如下所示。需要注意的是,其每一个指令都必须使用分号(;)结束,否则为语法错误。

正常运行的必备配置:

1、user USERNAME [GROUPNAME];    //:指定运行worker进程的用户和组;2、pid /PATH/TO/PIDFILE_NAME;    //:指定nginx的pid文件;3、worker_rlimit_nofile #;    //:指定一个worker进程所能够打开的最大文件句柄数;4、worker_rlimit_sigpending #;    //:设定每个用户能够发往worker进程的信号的数量;

优化性能相关的配置:

1、worker_processes #;    //:worker进程的个数;通常其数值应该为CPU的物理核心数减1;2、worker_cpu_affinity CPUMASK …;    //:CPU掩码;例如:worker_processes 6; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000; 3、ssl_engine DEVICE;    //:在存在ssl硬件加速器的服务器上,指定所使用的ssl硬件加速设备;4、timer_resolution TIME;    //:每次内核事件调用返回时,都会使用gettimeofday()来更新nginx缓存时钟;timer_resolution用于定义每隔多久才会由gettimeofday()更新一次缓存时钟;x86-64系统上,gettimeofday()代价已经很小,可以忽略此配置;5、worker_priority NICE;    //:nice值,-20~19之间的值;

事件相关的配置

1、accept_mutex [on|off];    //:是否打开ningx的负载均衡锁;此锁能够让多个worker进轮流地、序列化地与新的客户端建立连接;而通常当一个worker进程的负载达到其上限的7/8,master就尽可能不再将请求调度此worker;2、lock_file /PATH/TO/LOCK_FILE;    //:lock文件;3、accept_mutex_delay #MS;    //:accept锁模式中,一个worker进程为取得accept锁的等待时长;如果某worker进程在某次试图取得锁时失败了,至少要等待#ms才能再一次请求锁;默认为500ms;4、multi_accept on|off;    //:是否允许一次性地响应多个用户请求(并发连接);默认为Off; 5、use [epoll|rtsig|select|poll];    //:定义使用的事件模型,建议让nginx自动选择;6、worker_connections #;    //:每个worker能够并发响应最大请求数;

用于调试、定位问题:只调试nginx时使用

1、daemon on|off;    //:是否让ningx运行后台;默认为on,调试时可以设置为off,使得所有信息去接输出控制台;2、master_process on|off;    //:是否以master/worker模式运行nginx;默认为on;调试时可设置off以方便追踪;3、error_log /PATH/TO/ERROR_LOG LEVEL;    //:错误日志文件及其级别;默认为error级别;调试时可以使用debug级别,但要求在编译时必须使用--with-debug启用debug功能;

nginx的http web功能:

  http上下文专用于配置用于http的各模块,此类指令非常的多,每个模块都有其专用指定,具体请参数nginx官方wiki关于模块部分的说明。大体上来讲,这些模块所提供的配置指令还可以分为如下几个类别。

  客户端类指令:如client_body_buffer_size、client_header_buffer_size、client_header_timeout和keepalive_timeout等;

  文件IO类指令:如aio、directio、open_file_cache、open_file_cache_min_uses、open_file_cache_valid和sendfile等;

  hash类指令:用于定义Nginx为某特定的变量分配多大的内存空间,如types_hash_bucket_size、server_names_hash_bucket_size和variables_hash_bucket_size等;

  套接字类指令:用于定义Nginx如何处理tcp套接字相关的功能,如tcp_nodelay(用于keepalive功能启用时)和tcp_nopush(用于sendfile启用时)等;

  必须使用虚拟机来配置站点;每个虚拟主机使用一个server {}段配置;

server {    ……}

  非虚拟主机的配置或公共配置,需要定义在server之外,http之内;

http {    directive value;    ...    server {        ……    }    ……}

虚拟主机相关的配置:

1、server {}    //:定义一个虚拟主机;nginx支持使用基于主机名或IP的虚拟主机;2、listen     listen ADDRESS[:PORT];    listen PORT;    default_server ;    //:定义此server为http中默认的server;如果所有的server中没有任何一个listen使用此参数,那么第一个server即为默server;    rcvbuf=SIZE;    //:接收缓冲大小;    sndbuf=SIZE;    //:发送缓冲大小;    ssl;    //:https server;3、server_name [...];    //:server_name可以跟多个主机名,名称中可以使用通配符和正则表达式(通常以~开头);当nginx收到一个请求时,会取出其首部的server的值,而后跟众server_name进行比较;比较方式:    1)先做精确匹配;www.chencer.org     2)左侧通配符匹配;*.chencer.org    3)右侧通配符匹配;www.mas.org,www.*    4)正则表达式匹配;~^.*/.chencer/.org$4、server_name_hash_bucket_size 32|64|128;    //:为了实现快速主机查找,nginx使用hash表来保存主机名;5、location [ = | ~ | ~* | ^~ ] uri { ... }    location @name { ... }    功能:允许根据用户请求的URI来匹配指定的各location以进行访问配置;匹配到时,将被location块中的配置所处理;比如:http://www.chencer.org/images/logo.gif        =:精确匹配;        ~:正则表达式模式匹配,匹配时区分字符大小写        ~*:正则表达式模式匹配,匹配时忽略字符大小写        ^~:URI前半部分匹配,不检查正则表达式        :以指定路径逐字匹配;    匹配优先级:        字符字面量最精确匹配;        正则表达式检索(由第一个匹配到所处理);        按字符字面量;

文件路径定义:

1、root PATH;    //:设置web资源路径;用于指定请求的根文档目录;    location / {        root /www/htdocs;    }    location ^~ /images/ {        root /web;    }2、alias PATH;    //:只能用于location中,用于路径别名;    location / {        root /www/htdocs;    }    location ^~ /images/ {        alias /web;    }3、index FILE ...;    //:定义默认页面,可参跟多个值;4、error_page code ... [=[response]] uri;    //:当对于某个请求返回错误时,如果匹配上了error_page指令中设定的code,则重定向到新的URI中;即错误页面重定向;5、try_files path1 [path2 ...] uri;    //:自左至右尝试读取由path所指定路径,在第一次找到即停止并返回;如果所有path均不存在,则返回最后一个uri;    location ~* ^/documents/(.*)$ {        root /www/htdocs;        try_files $uri /docu/$1 /temp.html;    }

网络连接相关的设置:

1、keepalive_timeout TIME;    //:保持连接的超时时长;默认为75秒;2、keepalive_requests #;    //:在一次长连接上允许承载的最大请求数;3、keepalive_disable [msie6 | safari | none ];    //:对指定的浏览器禁止使用长连接;4、tcp_nodelay on|off;    //:对keepalive连接是否使用TCP_NODELAY选项;5、client_header_timeout TIME;    //:读取http请求首部的超时时长;默认为60秒;6、client_body_timeout TIME;    //:读取http请求包体的超时时长;默认为60秒;7、send_timeout time;    //:发送响应的超时时长;

对客户端请求的限制:

1、limit_except method ... { ... };    //:指定对范围之外的其它方法的访问控制;    limit_except GET {        allow 192.168.0.0/24;        deny all;     }2、client_max_body_size SIZE;    //:http请求包体的最大值;常用于限定客户所能够请求的最大包体;根据请求首部中的Content-Length(内容长度)来检测,以避免无用的传输;3、limit_rate speed;    //:限制客户端每秒钟传输的字节数;默认为0,表示没有限制;4、limit_rate_after time;   //:nginx向客户发送响应报文时,如果时长超出了此处指定的时长,则后续的发送过程开始限速;

文件操作的优化:

1、sendfile on|off;   //:是否启用sendfile功能;2、aio on|off;    //:是否启用aio功能;3、open_file_cache max=N [inactive=time]|off;    //:是否打开文件缓存功能;    max:缓存条目的最大值;当满了以后将根据LRU算法进行置换;    inactive:某缓存条目在指定时长时没有被访问过时,将自动被删除;默认为60s;     缓存的信息包括:        文件句柄、文件大小和上次修改时间;        已经打开的目录结构;        没有找到或没有访问权限的信息;4、open_file_cache_errors on|off;    //:是否缓存文件找不到或没有权限访问等相关信息;5、open_file_cache_valid time;    //:多长时间检查一次缓存中的条目是否超出非活动时长,默认为60s;6、open_file_cache_min_use #;    //:在inactive指定的时长内被访问超此处指定的次数地,才不会被删除;

对客户端请求的特殊处理:

1、ignore_invalid_headers on|off;    //:是否忽略不合法的http首部;默认为on;off意味着请求首部中出现不合规的首部将拒绝响应;只能用于server和http;2、log_not_found on|off;    //:是否将文件找不到的信息也记录进错误日志中;3、resolver ADDRESS;    //:指定nginx使用的dns服务器地址;4、resover_timeout TIME;    //:指定DNS解析超时时长,默认为30s; 5、server_tokens on|off;    //:是否在错误页面中显示nginx的版本号;

内存及磁盘资源分配:

1、client_body_in_file_only on|clean|off;    //:HTTP的包体是否存储在磁盘文件中;非off表示存储,即使包体大小为0也会创建一个磁盘文件;on表示请求结束后包体文件不会被删除,clean表示会被删除;2、client_body_in_single_buffer on|off;    //:HTTP的包体是否存储在内存buffer当中;默认为off;3、cleint_body_buffer_size SIZE(8m/16m);    //:nginx接收HTTP包体的内存缓冲区大小;4、client_body_temp_path dir-path [level1 [level2 [level3]]];    //:HTTP包体存放的临时目录;5、client_header_buffer_size size;    //:正常情况下接收用户请求的http报文header部分时分配的buffer大小;默认为1k;6、large_client_header_buffers number size;    //:存储超大Http请求首部的内存buffer大小及个数;7、connection_pool_size size;    //:nginx对于每个建立成功的tcp连接都会预先分配一个内存池,此处即用于设定此内存池的初始大小;默认为256;8、request_pool_size size;    //:nginx在处理每个http请求时会预先分配一个内存池,此处即用于设定此内存池的初始大小;默认为4k;

© 著作权归作者所有

广告 广告

评论区