1.1 Nginx介绍

HTTP协议发展简史

  •  https://coding.net/u/aminglinux/p/nginx/git/blob/master/http/version.md

  •  1991年发布0.9版,只有GET方法,仅支持html,一个连接一个请求

  •  1996年5月发布1.0版本,GET/POST/HEAD,HTTP Header,支持多种文件类型,一个连接一个请求

  •  1997年1月发布1.1版本,更多方法(DELETE/PUT),一个连接多个请求,虚拟主机等

  •  2015年发布HTTP/2版本,二进制协议,多工,数据流,头信息压缩和索引,服务器推送

HTTP协议相关概念

  •  https://coding.net/u/aminglinux/p/nginx/git/blob/master/http/http.md

  •  Request,Response,状态码,请求方法

  •  HTTP工作原理

  •  URI,URL

Nginx介绍

常见WebServer(排行https://news.netcraft.com/archives/2018/, https://w3techs.com/technologies/overview/web_server/all )

  • 老牌:Httpd(早期叫Apache) ,开源,市场份额最高

  • 微软:IIS

  • 轻量:Lighttpd,性能高,低耗能,功能欠缺

Nginx诞生

  • 2004年10月发布,俄国人Igor Sysoev开发,rambler.ru

Nginx官网、版本

  • nginx.org  1.14.0稳定版

  • 国内分支Tengine(http://tengine.taobao.org/) 

Nginx功能介绍

  • Http服务、反向代理、负载均衡、邮件代理、缓存加速、SSL、flv/mp4流媒体

1.2 Nginx安装(yum)

vi /etc/yum.repos.d/nginx.repo https://coding.net/u/aminglinux/p/nginx/git/blob/master/2z/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1
yum install -y nginxsystemctl start/stop/restart/reload nginx

测试:浏览器访问或者curl访问

  •  检查服务进程:ps aux |grep nginx

  •  检查端口监听:netstat -lnp |grep ‘:80’

  •  有防火墙,需加规则iptables -I INPUT -p tcp --dport 80 -j ACCEPT

nginx -V查看版本以及各个目录、参数

1.3 源码包安装

cd /usr/local/srcwget http://nginx.org/download/nginx-1.14.0.tar.gztar zxf nginx-1.14.0.tar.gzcd nginx-1.14.0; ./configure --prefix=/usr/local/nginxmake && make install

服务启动,关闭,加载等命令

/usr/local/nginx/sbin/nginx  //启动pkill nginx //杀死nginx进程,停止nginx服务killall nginx //效果是一样的killall的安装包如下:# rpm -qf `which killall`psmisc-22.20-15.el7.x86_64
/usr/local/nginx/sbin/nginx -t //检测配置文件语法错误/usr/local/nginx/sbin/nginx -s reload //重载配置

欢迎页面加载信息修改

# vim /usr/local/nginx/html/index.html

服务管理脚本

脚本内容: 

操作方法:

vim /etc/init.d/nginx

将脚本内容复制如下

#!/bin/bash# chkconfig: - 30 21# description: http service.# Source Function Library. /etc/init.d/functions# Nginx SettingsNGINX_SBIN="/usr/local/nginx/sbin/nginx"NGINX_CONF="/usr/local/nginx/conf/nginx.conf"NGINX_PID="/usr/local/nginx/logs/nginx.pid"RETVAL=0prog="Nginx"start() {    echo -n $"Starting $prog: "    mkdir -p /dev/shm/nginx_temp    daemon $NGINX_SBIN -c $NGINX_CONF    RETVAL=$?    echo    return $RETVAL}stop() {    echo -n $"Stopping $prog: "    killproc -p $NGINX_PID $NGINX_SBIN -TERM    rm -rf /dev/shm/nginx_temp    RETVAL=$?    echo    return $RETVAL}reload(){    echo -n $"Reloading $prog: "    killproc -p $NGINX_PID $NGINX_SBIN -HUP    RETVAL=$?    echo    return $RETVAL}restart(){    stop    start}configtest(){    $NGINX_SBIN -c $NGINX_CONF -t    return 0}case "$1" in  start)        start        ;;  stop)        stop        ;;  reload)        reload        ;;  restart)        restart        ;;  configtest)        configtest        ;;  *)        echo $"Usage: $0 {start|stop|reload|restart|configtest}"        RETVAL=1esacexit $RETVAL

赋予755权限

chmod 755 !$

以后启动,关闭nginx的命令就是:

/etc/init.d/nginx start/etc/init.d/nginx stop/etc/init.d/nginx restart

开机启动自动nginx

chkconfig --add nginxchkconfig nginx on

1.4 nginx配置文件详解1

Nginx配置文件

位置:

yum安装:

/etc/nginx/nginx.conf

源码包编译:

/usr/local/nginx/conf/nginx.conf

配置文件内容:

user nobody nobody;worker_processes 2;error_log /usr/local/nginx/logs/nginx_error.log crit;pid /usr/local/nginx/logs/nginx.pid;worker_rlimit_nofile 51200;events{    use epoll;    worker_connections 6000;}http{    include mime.types;    default_type application/octet-stream;    server_names_hash_bucket_size 3526;    server_names_hash_max_size 4096;    log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'    ' $host "$request_uri" $status'    ' "$http_referer" "$http_user_agent"';    sendfile on;    tcp_nopush on;    keepalive_timeout 30;    client_header_timeout 3m;    client_body_timeout 3m;    send_timeout 3m;    connection_pool_size 256;    client_header_buffer_size 1k;    large_client_header_buffers 8 4k;    request_pool_size 4k;    output_buffers 4 32k;    postpone_output 1460;    client_max_body_size 10m;    client_body_buffer_size 256k;    client_body_temp_path /usr/local/nginx/client_body_temp;    proxy_temp_path /usr/local/nginx/proxy_temp;    fastcgi_temp_path /usr/local/nginx/fastcgi_temp;    fastcgi_intercept_errors on;    tcp_nodelay on;    gzip on;    gzip_min_length 1k;    gzip_buffers 4 8k;    gzip_comp_level 5;    gzip_http_version 1.1;    gzip_types text/plain application/x-javascript text/css text/htm     application/xml;    server    {        listen 80;        server_name localhost;        index index.html index.htm index.php;        root /usr/local/nginx/html;        location ~ \.php$         {            include fastcgi_params;            fastcgi_pass unix:/tmp/php-fcgi.sock;            fastcgi_index index.php;            fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;        }        }}

配置文件结构分解:

  • 全局配置(user、worker_processes、error_log、pid)

  • events(网络连接相关,worker_connections)

  • http(最重要的部分,大部分功能都放这里)

  • server(虚拟主机相关)

  • location(server里面)

解释:

全局配置项结构

 

nginx.conf全局配置

user nobody;

定义运行nginx服务的用户,还可以加上组,如 user nobody nobody;

worker_processes 1;

定义nginx子进程数量,即提供服务的进程数量,该数值建议和服务cpu核数保持一致。除了可以定义数字外,还可以定义为auto,表示让系统自动调整。

error_log logs/error.log;

定义错误日志的路径,可以是相对路径(相对prefix路径的),也可以是绝对路径。该配置可以在此处定义,也可以定义到http、server、location里

error_log logs/error.log notice;

定义错误日志路径以及日志级别.错误日志级别:常见的错误日志级别有[debug|info|notice|warn|error|crit|alert|emerg],级别越高记录的信息越少。如果不定义默认是error

pid logs/nginx.pid;

定义nginx进程pid文件所在路径,可以是相对路径,也可以是绝对路径。

worker_rlimit_nofile 100000;

定义nginx最多打开文件数限制。如果没设置的话,这个值为操作系统(ulimit -n)的限制保持一致。把这个值设高,nginx就不会有“too many open files”问题了。

events配置项结构

 

events配置部分

worker_connections 1024;

定义每个work_process同时开启的最大连接数,即允许最多只能有这么多连接。 如果是2个wokr_process的话,那么就是1024*2=2048个连接数。连接数根据实际来定义,例如高并发的网站,例如淘宝网这参数就会设定几万了。

accept_mutex on;

当某一个时刻只有一个网络连接请求服务器时,服务器上有多个睡眠的进程会被同时叫醒,这样会损耗一定的服务器性能。 Nginx中的accept_mutex设置为on,将会对多个Nginx进程(worker processer)接收连接时进行序列化,防止多个进程争抢资源。 默认就是on。

multi_accept on;

nginx worker processer可以做到同时接收多个新到达的网络连接,前提是把该参数设置为on。 默认为off,即每个worker process一次只能接收一个新到达的网络连接。

use epoll;

Nginx服务器提供了多个事件驱动器模型来处理网络消息。 其支持的类型有:select、poll、kqueue、epoll、rtsing、/dev/poll以及eventport。 * select:只能在Windows下使用,这个事件模型不建议在高负载的系统使用 * poll:Nginx默认首选,但不是在所有系统下都可用 * kqueue:这种方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系统中是最高效的 * epoll: 这种方式是在Linux 2.6+内核中最高效的方式(Nginx上使用的就是Epoll) * rtsig:实时信号,可用在Linux 2.2.19的内核中,但不适用在高流量的系统中 * /dev/poll: Solaris 7 11/99+,HP/UX 11.22+, IRIX 6.5.15+, and Tru64 UNIX 5.1A+操作系统最高效的方式 * eventport: Solaris 10最高效的方式

http配置项

http配置部分

官方文档 
参考链接: 
参考链接: 
参考链接:http的header 

MIME-Type

include       mime.types;  //cat conf/mime.types定义nginx能识别的网络资源媒体类型(如,文本、html、js、css、流媒体等) default_type  application/octet-stream; 定义默认的type,如果不定义改行,默认为text/plain.

log_format

log_format main  '$remote_addr - $remote_user [$time_local] "$request" '                   '$status $body_bytes_sent "$http_referer" '                   '"$http_user_agent" "$http_x_forwarded_for"';其中main为日志格式的名字,后面的为nginx的内部变量组成的一串字符串。

access_log logs/access.log main;

定义日志的路径以及采用的日志格式,该参数可以在server配置块中定义。

sendfile on;

是否调用sendfile函数传输文件,默认为off,使用sendfile函数传输,可以减少user mode和kernel mode的切换,从而提升服务器性能。 对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。

sendfile_max_chunk 128k;

该参数限定Nginx worker process每次调用sendfile()函数传输数据的最大值,默认值为0,如果设置为0则无限制。

tcp_nopush on;

当tcp_nopush设置为on时,会调用tcp_cork方法进行数据传输。 使用该方法会产生这样的效果:当应用程序产生数据时,内核不会立马封装包,而是当数据量积累到一定量时才会封装,然后传输。这样有助于解决网络堵塞问题。 默认值为on。举例:快递员收快递、发快递,包裹累积到一定量才会发,节省运输成本。

keepalive_timeout 65 60;

该参数有两个值,第一个值设置nginx服务器与客户端会话结束后仍旧保持连接的最长时间,单位是秒,默认为75s。 第二个值可以省略,它是针对客户端的浏览器来设置的,可以通过curl -I看到header信息中有一项Keep-Alive: timeout=60,如果不设置就没有这一项。 第二个数值设置后,浏览器就会根据这个数值决定何时主动关闭连接,Nginx服务器就不操心了。但有的浏览器并不认可该参数。

send_timeout

这个超时时间是发送响应的超时时间,即Nginx服务器向客户端发送了数据包,但客户端一直没有去接收这个数据包。 如果某个连接超过send_timeout定义的超时时间,那么Nginx将会关闭这个连接。

client_max_body_size 10m;

浏览器在发送含有较大HTTP包体的请求时,其头部会有一个Content-Length字段,client_max_body_size是用来限制Content-Length所示值的大小的。 这个限制包体的配置不用等Nginx接收完所有的HTTP包体,就可以告诉用户请求过大不被接受。会返回413状态码。 例如,用户试图上传一个1GB的文件,Nginx在收完包头后,发现Content-Length超过client_max_body_size定义的值, 就直接发送413(Request Entity Too Large)响应给客户端。

gzip on;

是否开启gzip压缩。

gzip_min_length 1k;

设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是20。建议设置成大于1k的字节数,小于1k可能会越压越大。

gzip_buffers 4 16k;

设置系统获取几个单位的buffer用于存储gzip的压缩结果数据流。4 16k代表分配4个16k的buffer。

gzip_http_version 1.1;

用于识别 http 协议的版本,早期的浏览器不支持 Gzip 压缩,用户会看到乱码,所以为了支持前期版本加上了这个选项。 如果你用了Nginx反向代理并期望也启用Gzip压缩的话,由于末端通信是http/1.1,故请设置为 1.1。

gzip_comp_level 6;

gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)

gzip_types mime-type ... ;

匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。 在conf/mime.conf里查看对应的type。 示例:gzip_types       text/plain application/x-javascript text/css text/html application/xml;

gzip_proxied any;

Nginx作为反向代理的时候启用,决定开启或者关闭后端服务器返回的结果是否压缩,匹配的前提是后端服务器必须要返回包含”Via”的 header头。 以下为可用的值: off - 关闭所有的代理结果数据的压缩 expired - 启用压缩,如果header头中包含 "Expires" 头信息 no-cache - 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息 no-store - 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息private - 启用压缩,如果header头中包含 "Cache-Control:private" 头信息 no_last_modified - 启用压缩,如果header头中不包含 "Last-Modified" 头信息 no_etag - 启用压缩 ,如果header头中不包含 "ETag" 头信息 auth - 启用压缩 , 如果header头中包含 "Authorization" 头信息 any - 无条件启用压缩

gzip_vary on;

和http头有关系,会在响应头加个 Vary: Accept-Encoding ,可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用Squid缓存经

server配置项

nginx.conf server部分配置

server{} 包含在http{}内部,每一个server{}都是一个虚拟主机(站点)。

以下为nginx.conf配置文件中server{}部分的内容。

server {
    listen       80;  //监听端口为80,可以自定义其他端口,也可以加上IP地址,如,listen 127.0.0.1:8080;     server_name  localhost; //定义网站域名,可以写多个,用空格分隔。     #charset koi8-r; //定义网站的字符集,一般不设置,而是在网页代码中设置。     #access_log  logs/host.access.log  main; //定义访问日志,可以针对每一个server(即每一个站点)设置它们自己的访问日志。     ##在server{}里有很多location配置段     location / {
        root   html;  //定义网站根目录,目录可以是相对路径也可以是绝对路径。         index  index.html index.htm; //定义站点的默认页。     }     #error_page  404              /404.html;  //定义404页面     # redirect server error pages to the static page /50x.html     #     error_page   500 502 503 504  /50x.html;  //当状态码为500、502、503、504时,则访问50x.html     location = /50x.html {
        root   html;  //定义50x.html所在路径     }     # proxy the PHP scripts to Apache listening on 127.0.0.1:80     #     #定义访问php脚本时,将会执行本location{}部分指令     #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;  //proxy_pass后面指定要访问的url链接,用proxy_pass实现代理。     #}     # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000     #     #location ~ \.php$ {
    #    root           html;     #    fastcgi_pass   127.0.0.1:9000;  //定义FastCGI服务器监听端口与地址,支持两种形式,1 IP:Port, 2 unix:/path/to/sockt     #    fastcgi_index  index.php;     #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  //定义SCRIPT_FILENAME变量,后面的路径/scripts为上面的root指定的目录     #    include        fastcgi_params; //引用prefix/conf/fastcgi_params文件,该文件定义了fastcgi相关的变量     #}     # deny access to .htaccess files, if Apache's document root     # concurs with nginx's one     #      #location ~ /\.ht {   //访问的url中,以/.ht开头的,如,www.example.com/.htaccess,会被拒绝,返回403状态码。     #    deny  all;  //这里的all指的是所有的请求。     #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server {
#    listen       8000;  //监听8000端口 #    listen       somename:8080;  //指定ip:port #    server_name  somename  alias  another.alias;  //指定多个server_name #    location / {
#        root   html; #        index  index.html index.htm; #    } #} # HTTPS server # #server {
#    listen       443 ssl;  //监听443端口,即ssl #    server_name  localhost; ### 以下为ssl相关配置 #    ssl_certificate      cert.pem;    //指定pem文件路径 #    ssl_certificate_key  cert.key;  //指定key文件路径 #    ssl_session_cache    shared:SSL:1m;  //指定session cache大小 #    ssl_session_timeout  5m;  //指定session超时时间 #    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   //指定ssl协议 #    ssl_ciphers  HIGH:!aNULL:!MD5;  //指定ssl算法 #    ssl_prefer_server_ciphers  on;  //优先采取服务器算法 #    location / {
#        root   html; #        index  index.html index.htm; #    } #}
server {    listen       80;  //监听端口为80,可以自定义其他端口,也可以加上IP地址,如,listen 127.0.0.1:8080;    server_name  localhost; //定义网站域名,可以写多个,用空格分隔。    #charset koi8-r; //定义网站的字符集,一般不设置,除非在网页乱码。而是在网页代码中设置,。    #access_log  logs/host.access.log  main; //定义访问日志,可以针对每一个server(即每一个站点)设置它们自己的访问日志。    ##在server{}里有很多location配置段    location / {        root   html;  //定义网站根目录,目录可以是相对路径也可以是绝对路径。        index  index.html index.htm; //定义站点的默认页,即索引页。    }    #error_page  404              /404.html;  //定义404页面    # redirect server error pages to the static page /50x.html    #    error_page   500 502 503 504  /50x.html;  //当状态码为500、502、503、504时,则访问50x.html    location = /50x.html {        root   html;  //定义50x.html所在路径    }    # proxy the PHP scripts to Apache listening on 127.0.0.1:80    #    #定义访问php脚本时,将会执行本location{}部分指令    #location ~ \.php$ {    #    proxy_pass   http://127.0.0.1;  //proxy_pass后面指定要访问的url链接,用proxy_pass实现代理。    #}    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000    #    !!!!proxy_pass代理web网站,fastcgi_pass后跟php-fpm地址。!!!!    #location ~ \.php$ {    #    root           html;    #    fastcgi_pass   127.0.0.1:9000;  //定义FastCGI服务器监听端口与地址,支持两种形式,1 IP:Port, 2 unix:/path/to/sockt    #    fastcgi_index  index.php;    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  //定义SCRIPT_FILENAME变量,后面的路径/scripts为上面的root指定的目录    #    include        fastcgi_params; //引用prefix/conf/fastcgi_params文件,该文件定义了fastcgi相关的变量    #}    # deny access to .htaccess files, if Apache's document root    # concurs with nginx's one    #     #location ~ /\.ht {   //访问的url中,以/.ht开头的,如,www.example.com/.htaccess,会被拒绝,返回403状态码。    #    deny  all;  //这里的all指的是所有的请求。    #}}# another virtual host using mix of IP-, name-, and port-based configuration##server {#    listen       8000;  //监听8000端口,监听不同的端口。#    listen       somename:8080;  //指定ip:port#    server_name  somename  alias  another.alias;  //指定多个server_name#    location / {#        root   html;#        index  index.html index.htm;#    }#}# HTTPS server##server {#    listen       443 ssl;  //监听443端口,即ssl#    server_name  localhost;### 以下为ssl相关配置#    ssl_certificate      cert.pem;    //指定pem文件路径#    ssl_certificate_key  cert.key;  //指定key文件路径#    ssl_session_cache    shared:SSL:1m;  //指定session cache大小#    ssl_session_timeout  5m;  //指定session超时时间#    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   //指定ssl协议#    ssl_ciphers  HIGH:!aNULL:!MD5;  //指定ssl算法#    ssl_prefer_server_ciphers  on;  //优先采取服务器算法#    location / {#        root   html;#        index  index.html index.htm;#    }#}