nginx学习资料整理一

一、安装运行

1.1、安装环境支撑

1、gcc 环境,一般情况linux 系统自带该环境,也可自行下载安装使用新版本;

2、pcre 环境,一般需自行安装,其是一个perl库,包含正则表达式等功能,http模块使用pcre来解析正则表达式配置的URI匹配规则;

3、zlib环境,一般需要自行安装,免费的无损数据压缩库;nginx 使用 zlib http 包的内容进行 gzip 压缩;

4、openssl环境,一般需要自行安装,安全套接字层密码库,用于支持sslhttps协议;  

1.2、环境安装

1、gcc环境检测

   目前使用centos 系统,装在virtualBox中,可使用命令检测是否安装gcc环境,如下:

   命令:gcc -v

  若未安装,请自行百度安装 

2、安装pcre环境

a、下载pcre 包,目前使用是 pcre-8.13.tar.gz 

a、解压包到指定目录

命令: tar -zxvf pcre-8.13.tar.gz

b、配置pcre ,先进入解压后的目录,再执行以下命令

命令: ./configure --prefix=安装目录

c、编译pcre 包,在解压后的目录下,执行

命令:make

d、安装pcre环境 ,在解压后的目录下,执行

命令:make install

e、验证pcre环境,安装是否成功

   命令: ./pcre-config --version 

  3、安装zlib

下载zlib包,官网:http://www.zlib.net/ ,目前使用 zlib-1.2.11.tar.gz 

3、解压包到指定目录

命令: tar -zxvf zlib-1.2.11.tar.gz

c、配置zlib,并指定utf-8编码,先进入解压后的目录,再执行以下命令

命令: ./configure --prefix=安装目录

d、编译zlib包,在解压后的目录下,执行

命令:make

e、安装zlib环境 ,在解压后的目录下,执行

命令:make install

4、安装openssl 环境

a、下载openssl 包,官网:https://www.openssl.org/source/ ,目前使用 openssl-1.0.2j.tar.gz 

解压包到指定目录

命令: tar -zxvf openssl-1.0.2j.tar.gz

c配置openssl,先进入解压后的目录,再执行以下命令

命令: ./config --prefix=安装目录

d编译openssl包,在解压后的目录下,执行

命令:make

e安装openssl环境 ,在解压后的目录下,执行

命令:make install

1.3、安装nginx

1、下载nginx安装包,https://nginx.org/download/ ,目前使用nginx-1.9.9.tar.gz 

2、解压包到指定目录

命令: tar -zxvf nginx-1.9.9.tar.gz

3、配置nginx,先进入解压后的目录,再执行以下命令  

   ./configure --prefix=/opt/nginx/install/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-pcre=/opt/pcre/pcre-8.13 --with-openssl=/opt/openssl/openssl-1.0.2j  --with-zlib=/opt/zlib/zlib-1.2.11

   注:--prefix=安装目录  

       --with-pcre=安装的pcre目录

       --with-openssl=安装的openssl目录

       --with-zlib=安装的zlib目录

       --with-http_ssl_module : 使用https协议模块。默认情况下,该模块没有被构建。前提是opensslopenssl-devel已安装

       --with-http_stub_status_module : 用来监控 Nginx 的当前状态

       --with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如X-Real-IP X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址

       --add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模块都要重新编译(Tengine可以在新加入module时无需重新编译)

       --with-http_gzip_static_modulegzip 压缩相关

4、编译nginx包,在解压后的目录下,执行 

命令:make

5、安装nginx环境 ,在解压后的目录下,执行

命令:make install

6、验证安装是否成功,进入配置的安装路径,执行以下命令:

  

注:syntax is ok ,test is successful 表示安装成功 

1.4、运行nginx

1、启动nginx,命令:./sbin/nginx ,如下

 2、访问首页,如下: 

1.5、虚拟机相关设置

    查看访火墙的状态: systemctl status firewalld

 启动访火墙:systemctl start firewalld 

 启用访火墙区域端口和协议组合:firewall-cmd --zone=public --add-port=8080/tcp --permanent  

 插入访火墙接入访问ip表端口:/sbin/iptables -I INPUT -p tcp --dport 8088 -j ACCEPT

   nohup java -jar upstream-0.0.1-SNAPSHOT.jar --server.port=8888 >/dev/null 2>&1 & 

二、nginx基本情况

2.1、基本命令

       启动     ./sbin/nginx

       停止     ./sbin/nginx -s stop

       重启 ./sbin/nginx -s reload

       查看进程 ps -ef|grep nginx

2.2、目录结构

        ./nginx 安装目录:

      ./conf 配置文件目录: 

  ./sbin 命令bin目录:

 ./html 默认web目录:

  ./logs 日志文件目录:

2.3、默认配置

         ./nginx/conf/nginx.conf 文件:

1、配置nginx 开机启动,以centos 为例:

a、切换到/usr/lib/systemd/system/目录,创建nginx.service文件

       vi nginx.service

b、写入以下文件,注意修改目录

[Unit]

Description=nginx

After=network.target    
[Service]
Type=forking
ExecStart=/opt/nginx/install/nginx/sbin/nginx
ExecReload=/opt/nginx/install/nginx/sbin/nginx -s reload
ExecStop=/opt/nginx/install/nginx/sbin/nginx quit
PrivateTmp=true    
[Install]
WantedBy=multi-user.target

c、设为开机启动

systemctl enable nginx.service

d、查看状态  

systemctl status nginx.service

   重启机器自动运行后的状态: 

 

 注:nginx 启动后分为master进程与worker进程,worker进程处理对外请求,master不处理对外请求,管理worker进程 

三、nginx 配置

3.1、全局配置

     1user 配置,用于指定nginx worker进程的用户、用户组,可对nginx 进程权限控制

        如:user root root ,指定root 用户,root  用户组运行 

2、worker_processes 配置,用于指定nginx进程数,默认为1

        如:worker_processes 2;

3、pid 配置,用于指定进程id存储文件

        如:pid   logs/nginx.pid;

4、error_log 配置,用于指定全局模块错误日志

   语法:error_log file [ debug | info | notice | warn | error | crit ]

     如:error_log  logs/error.log  info;

5、include配置,用于指定需包含的配置文件

     如:include vhosts/*.conf; 

  6、其他全局配置,请参考官方文档

       https://www.nginx.cn/doc/core/mainmodule.html  

3.2events 模块

     配置nginx服务器与用户的网络连接参数,主要是配置每个进程的最大连接数,使用哪种事件驱动模型处理请求;是否允许同时接受多个网路连接,开启多个网络连接序列化等。

     示例:

events {

    accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on

    multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off

    use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport

    worker_connections 1024; # 最大连接数

    client_header_buffer_size 4k;

    open_file_cache max=2000 inactive=60s;

    open_file_cache_valid 60s;

    open_file_cache_min_uses 1

} 

 1、accept_mutex 配置,设置网路连接序列化,防止惊群现象发生,默认为on 

 2、multi_accept 配置,设置一个进程是否同时接受多个网络连接,默认为off 

 3、worker_connections配置,配置一个进程的最大连接数,默认与系统有关,一般为1024,最大不能超过系统连接数,

       如:worker_connections  1024

       客户端最大连接数(理论值):worker_processes * worker_connections  

       反向代理后最大连接数:worker_processes * worker_connections/4 

   4worker_rlimit_nofile配置,指定一个nginx进程最多打开文件数,配置成与linux内核数一致,可使用ulimit -n 查看系统数

   如:worker_rlimit_nofile65536 

 5、事件驱动模型配置,Nginx服务器提供了多个事件驱动器模型来处理网络消息。其支持的类型有:selectpollkqueueepollrtsing/dev/poll以及eventport

 * select:只能在Windows下使用,这个事件模型不建议在高负载的系统使用

* poll:Nginx默认首选,但不是在所有系统下都可用

* kqueue:这种方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, MacOS X系统中是最高效的

* epoll: 这种方式是在Linux 2.6+内核中最高效的方式

* 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最高效的方式 

注:若未配置该项,nginx则会选择适合系统的配置,一般poll ,但在linux 高版本中建议选择epoll ;

6、其他相关配置,请参考官方文档

    https://www.nginx.cn/doc/core/events.html  

3.3HTTP 模块

可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

3.3.1http core 核心模块

   1default_type 配置,设置默认类型,默认值为text/plain

     如:default_type  application/octet-stream;  

  2sendfile配置,指定是否使用sendfile系统调用来传输文件,默认为offsendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝。

  如:sendfile        on; 

  3、keepalive_timeout配置,连接超时时间,默认值为75 ,

          如:keepalive_timeout 75s ; 

  4、tcp_nopush配置,使用sendfile 时,设置tcp_nopush 用于解决阻塞,与tcp_nodelay互斥;

 如:tcp_nopush on ;

  5、其他相关配置 (来源于网上)     

include mime.types; #主模块指令,实现对配置文件所包含的文件设定,可以减少主配置文件的复杂度,类似apache中的include方法。

default_type application/octet-stream;  #属于http核心模块指令,这里默认类型为二进制流,也就是当文件类型未定义是使用这种方式,例如在没有配置php环境时,nginx是不予解析的,此时,用浏览器访问php文件就会出现下载窗口

charset utf-8;  #默认编码

server_names_hash_bucket_size 128;  #服务器名字的hash表大小

proxy_headers_hash_max_size 51200;  #设置头部哈希表的最大值,不能小于你后端服务器设置的头部总数

proxy_headers_hash_bucket_size 6400; #设置头部哈希表大小

client_header_buffer_size 32k; #用于指定来自客户端请求头headerbuffer大小,对于大多数请求,1KB的缓冲区大小已经足够,如果自定义了消息头或有更大的cookie,可以增加缓冲区大小。这里设置为32KB

large_client_header_buffers 4 128k; #用来指定客户端请求中较大的消息头的缓存最大数量和大小,“4”为个数,“128”为大小,最大缓存为4128KB

sendfile on; #开启高效文件传输模式,将tcp_nopushtcp_nodely两个指令设置为on,用于防止网络阻塞。

autoindex on;  #开启目录列表访问,合适下载服务器,默认关闭。

tcp_nopush on; #防止网络阻塞

tcp_nodelay on;  #防止网络阻塞

keepalive_timeout 120;  #用于设置客户端连接保持活动的超时时间,在超过这个时间之后服务器会关闭该链接。

client_header_timeout 3m #用于设置客户端请求读取超时时间,如果超过这个时间,客户端没有发送任何数据,nginx将返回“request time out (408)”错误。

client_body_timeout 3m; #用于设置客户端请求主体读取超时时间,默认值为60.如果超过这个时间,客户端还没有发送任何数据,nginx将返回“Request time out(408)”

server_tokens off; #修改或隐藏Nginx的版本号

client_body_buffer_size 256k; # 缓冲区代理缓冲用户端请求的最大字节数

send_timeout 3m;  #服务器超时设置

#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。

fastcgi_connect_timeout 300; #指定连接到后端fastCGI的超时时间

fastcgi_send_timeout 300;     #fastCGI请求的超时时间,这个值是指已经完成两次握手后向fastCGI传送的超时时间

fastcgi_read_timeout 300;     #接收fastCGI应答的超时时间,这个值已经完成两次握手后接收fastCGI应答的超时时间

fastcgi_buffer_size 64k;     #指定读取fastCGI应答第一部分需要用多大的缓冲区,一般第一部分应答不会超过1k,一般设置为64k

fastcgi_buffers 4 64k;         #指定本地需要用多少和多大的缓冲区来缓冲fastCGI的应答

fastcgi_busy_buffers_size 128k;     #默认值是fastcgi_buffers的两倍

fastcgi_temp_file_write_size 128k;     #在写入fastcgi_temp_path是用多大的数据块,默认值是fastcgi_buffers两倍

#gzip模块设置

gzip on; #开启  #gzip压缩输出

gzip_min_length 1k; #用于设置允许压缩的页面最小字节数,页面字节数从header头的content-length中获取,默认值是0

不管页面多大都进行压缩,建议设置成大于1k的字节数,小于1k可能会越压越大最小压缩文件大小

gzip_buffers 4 16k; #表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果

gzip_http_version 1.0;  #压缩版本(默认1.1,前端如果是squid2.5请使用1.0

gzip_comp_level 2; #压缩等级

gzip_types text/plain application/x-javascript text/css application/xml;

#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn

gzip_vary on; #选项可让前端的缓存服务器缓存经过gzip压缩的页面,例如,用squid缓存经过nginx压缩的数据。

limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

6、参考官网

https://www.nginx.cn/doc/standard/httpcore.html 

3.4、日志配置

1log_format 配置,用于指定nginx输出日志格式

    语法: log_format name format [format ...]

    如:

    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

客户端地址

219.227.111.255

$remote_user

客户端用户名称

$time_local

访问时间和时区

18/Jul/2014:17:00:01 +0800

$request

请求的URIHTTP协议

“GET /article-10000.html HTTP/1.1”

$http_host

请求地址,即浏览器中你输入的地址(IP或域名)

www.ha97.com

198.98.120.87

$status

HTTP请求状态

200

$upstream_status

upstream状态

200

$body_bytes_sent

发送给客户端文件内容大小

1547

$http_referer

url跳转来源

https://www.google.com/

$http_user_agent

用户终端浏览器等信息

“Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;

$ssl_protocol

SSL协议版本

TLSv1

$ssl_cipher

交换数据中的算法

RC4-SHA

$upstream_addr

后台upstream的地址,即真正提供服务的主机地址

10.36.10.80:80

$request_time

整个请求的总时间

0.165

$upstream_response_time

请求过程中,upstream响应时间

0.002

  2、access_log配置,指令日志文件存放路径 ,

  如:access_log  logs/access.log  main; 

 3.5server 配置模块

     配置虚拟主机的相关参数,一个http中可以有多个server

     #虚拟主机的配置

server

{

#listen指定虚拟主机服务器端口

Listen  80;

#server_name用来指定ip地址或者域名,多个域名之间用空格分开

server_name www.ha97.com ha97.com;

#index用于设定访问的默认首页地址

Index  index.html index.htm index.php;

#root指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以使绝对路径

root /data/www/ha97;

#charser用于设置网页的默认编码格式

Charest  gb2312;

#access_log用来指定此虚拟机的访问日志存放路径

access_log /data/logs/nginx/goods.access.log;

#error_log 用来指定此虚拟机的错误日志存放路径

error_log /data/logs/nginx/goods.error.log;

#配置请求的路由,以及各种页面的处理情况。

location / {

            root   html;

            index  index.html index.htm;

 }
}

 3.6upstream 配置模块

     用于负载均衡配置

  upstream demo.com {

least_conn; #调度算法

server 192.168.137.3:8888;

server 192.168.137.3:8881;

server 192.168.137.3:8881 backup;

}

 nginx的负载均衡支持4种调度算法:

轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统自动剔除,使用户访问不受影响,

weight  指定轮询权值,weight值越大,分配到的访问几率越高,主要用于后端每个服务器性能不均的情况下

ip_hash 每个请求按访问iphash结果分配,这样来自同一个ip的访客固定访问一个后端服务器,有效解决动态网页

存在的session共享问题

fair  比上面连个更加智能的算法,此种算法可以依据页面大小和加载时间长短智能的进行负载均衡,也就是根据后端服务器的

响应时间来分配请求,响应时间短的优先分配,nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载nginxupstream_fair模块

url_hash 此方法按访问的urlhash结果来分配请求,是每个url定向到同一个后端服务器,可以进一步提高后端缓存

服务器的效率,nginx本身是不支持url_hash,如果需要使用这种调度算法,必须安装nginxhash软件包

http upstream模块中,可以通过server指令指定后端服务器的ip地址和端口,同时还可以设定每个后端服务器在

负载均衡调度中的状态,常用的几种状态有:

down  表示当前的server暂时不参与负载均衡

backup 预留的备份机器,当其他所有的非backup机器出现故障或者忙的时候才会请求backup机器,因此这台机器的压力最轻

max_fails 允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误

fail_timeout 在经历了max_fails此失败后,暂停服务的时间,max_fails可以和fail_timeout一起使用

3.7location 区段

用于反向代理不同服务器,参考官网:

https://www.nginx.cn/doc/standard/httpproxy.html 

   基本语法如下:location [=|~|~*|^~|@] pattern{……}

   示例:

     location / {

proxy_pass        http://localhost:8000;

proxy_set_header  X-Real-IP  $remote_addr;

}

 1、相关解析:

location / {

proxy_pass http://127.0.0.1:88;

proxy_redirect off;

proxy_set_header X-Real-IP $remote_addr;

#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#以下是一些反向代理的配置,可选。

proxy_set_header Host $host;

client_max_body_size 10m; #允许客户端请求的最大单文件字节数

client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,

proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)

proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)

proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)

proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小

proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置

proxy_busy_buffers_size 64k; #高负荷下缓冲大小

(proxy_buffers*2)

proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传

}

 2、优先级

1:带有“=“的精确匹配优先

2:没有修饰符的精确匹配

3:正则表达式按照他们在配置文件中定义的顺序

4:带有“^~”修饰符的,开头匹配

5:带有“~” “~*” 修饰符的,如果正则表达式与URI匹配

6:没有修饰符的,如果指定字符串与URI开头匹配

原文地址:https://www.cnblogs.com/xin_ny/p/12864611.html