千家信息网

nginx安装配置

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器,nginx是由igor sysoev为俄罗斯访问量第二的Rambler.ru站点开发的。1、nginx
千家信息网最后更新 2024年11月23日nginx安装配置


nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器,nginx是由igor sysoev为俄罗斯访问量第二的Rambler.ru站点开发的。


1、nginx安装与配置

下载地址:http://nginx.org/download/nginx-1.12.1.tar.gz

安装准备:nginx依赖于pcre库,需要先安装pcre pcre-devel

yum install pcre pcre-devel -ymkdir /root/toolscd /root/toolswget http://nginx.org/download/nginx-1.12.1.tar.gztar zxf nginx-1.12.1.tar.gz cd nginx-1.12.1useradd -s /sbin/nologin nginx -M./configure \--user=nginx \--group=nginx \--prefix=/usr/local/nginx \--with-http_ssl_module \--with-http_stub_status_modulemake && make installecho $?ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginxcd /usr/local/nginx

[root@localhost nginx]# tree

.├── conf   #配置文件│   ├── fastcgi.conf│   ├── fastcgi.conf.default│   ├── fastcgi_params│   ├── fastcgi_params.default│   ├── koi-utf│   ├── koi-win│   ├── mime.types│   ├── mime.types.default│   ├── nginx.conf│   ├── nginx.conf.default│   ├── scgi_params│   ├── scgi_params.default│   ├── uwsgi_params│   ├── uwsgi_params.default│   └── win-utf├── html  #网页文件│   ├── 50x.html│   └── index.html├── logs   #日志文件└── sbin   #主要二进制程序    ├── nginx


1)nginx 信号控制:

TERM,INT quick shutdown

QUIT 优雅的关闭进程,即等待请求结束后再关闭

HUP 改变配置文件,平滑的重读配置文件

USR1 重读日志,在日志按月、日分隔时使用

USR2 平滑升级

WINCH 优雅关闭进程,配合USR2来进行升级


启动nginx:

/usr/local/nginx/sbin/nginx

重启动nginx:

kill -QUIT `cat /usr/local/nginx/logs/nginx.pid` && /usr/local/nginx/sbin/nginx

重新加载配置文件:

kill -HUP `cat /usr/local/nginx/logs/nginx.pid`

/usr/local/nginx/sbin/nginx -s reload

停止nginx:

kill -INT `cat /usr/local/nginx/logs/nginx.pid`

/usr/local/nginx/sbin/nginx -s stop/quit

重读日志文件:

kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

/usr/local/nginx/sbin/nginx -s reopen


2)nginx配置文件:

access_log日志格式变量说明:


$remote_addr #远程客户端IP

$remote_user #客户端用户信息

$time_local # 本地时间

$request #请求方式,路径和版本

$status #响应状态

$body_bytes_sent #发送到客户端的字节数

$http_referer #上一次页面来自哪

$http_user_agent #客户端代理信息

$http_x_forwarded_for #代理服务器转发地址

#user  nobody;   #运行用户worker_processes  1; #工作进程,一般为CPU数*核数#全局错误日志#error_log  logs/error.log; #error_log  logs/error.log  notice;#error_log  logs/error.log  info;#PID文件#pid        logs/nginx.pid;events {     use   epoll;  #epoll是多路复用IO(I/OMultiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能  #一般是配置nginx链接的特性,如一个worK能同时允许多个个链接    worker_connections  1024; #指一个进程最大允许1024个链接}http {   #配置http服务器的主要段    include       mime.types; #设定mime类型,类型由mime.type文件定义    default_type  application/octet-stream; #设定日志格式    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '    #                  '$status $body_bytes_sent "$http_referer" '    #                  '"$http_user_agent" "$http_x_forwarded_for"';    #access_log  logs/access.log  main;    sendfile        on;  #指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.    #tcp_nopush     on;    #keepalive_timeout  0;    keepalive_timeout  65;  #连接超时时间    #gzip  on;   #开启gzip压缩     #设定请求缓冲    client_header_buffer_size    1k;    large_client_header_buffers  4 4k;    #设定负载均衡的服务器列表     upstream mysvr {    #weigth参数表示权值,权值越高被分配到的几率越大    #本机上的Squid开启3128端口    server 192.168.8.1:3128 weight=5;    server 192.168.8.2:80  weight=1;    server 192.168.8.3:80  weight=6;    }    server {   #虚拟主机        listen       80;  #侦听80端口        server_name  localhost; #定义使用www.xx.com访问        #charset koi8-r;        #设定本虚拟主机的访问日志        #access_log  logs/host.access.log  main;        #默认请求        location / {            root   html; #定义服务器的默认网站根目录位置            index  index.html index.htm; #定义首页索引文件的名称        }        # 定义错误提示页面        #error_page  404              /404.html;        # redirect server error pages to the static page /50x.html        #        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }        #反向代理        #location ~ \.php$ {        #    proxy_pass   http://127.0.0.1;        #}        #转发PHP动态页面给PHP程序处理        #location ~ \.php$ {        #    root           html;        #    fastcgi_pass   127.0.0.1:9000;        #    fastcgi_index  index.php;        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;        #    include        fastcgi_params;}

3)实际应用: shell+定时任务+nginx信号管理,完成日志按日期存储

分析思路:

凌晨00:00:01,把昨天的日志重命名,放在相应的目录下

再USR1信息号控制nginx重新生成新的日志文件

具体脚本:

#!/bin/bashbase_path='/usr/local/nginx/logs'log_path=$(date -d yesterday +"%Y%m")day=$(date -d yesterday +"%d")mkdir -p $base_path/$log_pathmv $base_path/access.log $base_path/$log_path/access_$day.log#echo $base_path/$log_path/access_$day.logkill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

定时任务

Crontab 编辑定时任务

01 00 * * * /xxx/path/b.sh 每天0时1分(建议在02-04点之间,系统负载小)


4)location 语法

location 有"定位"的意思, 根据Uri来进行不同的定位.

在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分,定位到不同的处理方式上.

比如, 碰到.php, 如何调用PHP解释器? --这时就需要location

location 的语法

location [=|~|~*|^~] patt {

}

中括号可以不写任何参数,此时称为一般匹配

也可以写参数

因此,大类型可以分为3种

location = patt {} [精准匹配]

location patt{} [一般匹配]

location ~ patt{} [正则匹配]


如何发挥作用?:

首先看有没有精准匹配,如果有,则停止匹配过程.

location = patt {    config A}如果 $uri == patt,匹配成功,使用config A   location = / {              root   /var/www/html/;             index  index.htm index.html;        }           location / {             root   /usr/local/nginx/html;            index  index.html index.htm;  }

如果访问  http://xxx.com/

定位流程是 

1: 精准匹配中 "/" ,得到index页为  index.htm

2: 再次访问 /index.htm , 此次内部转跳uri已经是"/index.htm" ,

根目录为/usr/local/nginx/html

3: 最终结果,访问了 /usr/local/nginx/html/index.htm

正则也来参与.

location / {            root   /usr/local/nginx/html;            index  index.html index.htm;        }location ~ p_w_picpath {           root /var/www/p_w_picpath;           index index.html;}

如果我们访问 https://cache.yisu.com/upload/information/20200309/32/37286.jpg

此时, "/" 与"/p_w_picpath/logo.png" 匹配

同时,"p_w_picpath"正则 与"p_w_picpath/logo.png"也能匹配,谁发挥作用?

正则表达式的成果将会使用.

图片真正会访问 /var/www/p_w_picpath/logo.png

location / {             root   /usr/local/nginx/html;             index  index.html index.htm;         } location /foo {            root /var/www/html;             index index.html;}

我们访问 http://xxx.com/foo

对于uri "/foo", 两个location的patt,都能匹配他们

即 '/'能从左前缀匹配 '/foo', '/foo'也能左前缀匹配'/foo',

此时, 真正访问 /var/www/html/index.html

原因:'/foo'匹配的更长,因此使用之.;


5)rewrite 重写

重写中用到的指令

if (条件) {} 设定条件,再进行重写

set #设置变量

return #返回状态码

break #跳出rewrite

rewrite #重写

If 语法格式

If 空格 (条件) {

重写模式

}


条件又怎么写?

答:3种写法

1: "="来判断相等, 用于字符串比较

2: "~" 用正则来匹配(此处的正则区分大小写)

~* 不区分大小写的正则

3: -f -d -e来判断是否为文件,为目录,是否存在.

例子:

            if  ($remote_addr = 192.168.1.100) {                return 403;            } if ($http_user_agent ~ MSIE) {                rewrite ^.*$ /ie.htm;                break; #(不break会循环重定向) }             if (!-e $document_root$fastcgi_script_name) {                rewrite ^.*$ /404.html break;            }

注, 此处还要加break,以 xx.com/dsafsd.html这个不存在页面为例,我们观察访问日志, 日志中显示的访问路径,依然是GET /dsafsd.html HTTP/1.1

提示: 服务器内部的rewrite和302跳转不一样. 跳转的话URL都变了,变成重新http请求404.html, 而内部rewrite, 上下文没变,就是说 fastcgi_script_name 仍然是 dsafsd.html,因此 会循环重定向.set 是设置变量用的, 可以用来达到多条件判断时作标志用.达到apache下的 rewrite_condition的效果

如下: 判断IE并重写,且不用break; 我们用set变量来达到目的

if ($http_user_agent ~* msie) {                set $isie 1;            }            if ($fastcgi_script_name = ie.html) {                set $isie 0;            }            if ($isie 1) {                rewrite ^.*$ ie.html;            }

Rewrite语法

Rewrite 正则表达式 定向后的位置 模式

Goods-3.html ---->Goods.php?goods_id=3goods-([\d]+)\.html ---> goods.php?goods_id =$1  location /ecshop {index index.php;rewrite goods-([\d]+)\.html$ /ecshop/goods.php?id=$1;rewrite article-([\d]+)\.html$ /ecshop/article.php?id=$1;rewrite category-(\d+)-b(\d+)\.html /ecshop/category.php?id=$1&brand=$2;注意:用url重写时, 正则里如果有"{}",正则要用双引号包起来


6)gzip压缩

原理:浏览器---请求----> 声明可以接受 gzip压缩 deflate压缩 compress sdch压缩

http协议的角度看--请求头 声明 acceopt-encoding: gzip deflate sdch (是指压缩算法,其中sdchgoogle倡导的一种压缩方式,目前支持的服务器尚不多)服务器-->回应---把内容用gzip方式压缩---->发给浏览器浏览<-----解码gzip-----接收gzip压缩内容----


gzip配置的常用参数

gzip on|off; #是否开启gzip

gzip_buffers 32 4K| 16 8K #缓冲(压缩在内存中缓冲几块? 每块多大?)

gzip_comp_level [1-9] #推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)

gzip_disable #正则匹配UA 什么样的Uri不进行gzip

gzip_min_length 200 # 开始压缩的最小长度(再小就不要压缩了,意义不在)

gzip_http_version 1.0|1.1 # 开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)

gzip_proxied # 设置请求者代理服务器,该如何缓存内容

gzip_types text/plain application/xml # 对哪些类型的文件用压缩 txt,xml,html ,css

gzip_vary on|off # 是否传输gzip压缩标志


注意:图片/mp3这样的二进制文件,不必压缩

因为压缩率比较小, 比如100->80字节,而且压缩也是耗费CPU资源的.比较小的文件不必压缩


7)nginx的缓存设置 提高网站性能

对于网站的图片,尤其是新闻站, 图片一旦发布, 改动的可能是非常小的.我们希望能否在用户访问一次后, 图片缓存在用户的浏览器端,且时间比较长的缓存.

可以, 用到 nginx的expires设置 .

nginx中设置过期时间,非常简单,在location或if段里,来写.

格式:expires 30s;

expires 30m;

expires 2h;

expires 30d;

(注意:服务器的日期要准确,如果服务器的日期落后于实际日期,可能导致缓存失效)

另: 304 也是一种很好的缓存手段

原理是: 服务器响应文件内容是,同时响应etag标签(内容的签名,内容一变,他也变), 和 last_modified_since 2个标签值

浏览器下次去请求时,头信息发送这两个标签, 服务器检测文件有没有发生变化,如无,直接头信息返回 etag,last_modified_since

浏览器知道内容无改变,于是直接调用本地缓存.

这个过程,也请求了服务器,但是传着的内容极少.

对于变化周期较短的,如静态html,js,css,比较适于用这个方式


8)nginx反向代理服务器+负载均衡

用nginx做反向代理和负载均衡非常简单,

支持两个用法 1个proxy, 1个upstream,分别用来做反向代理,和负载均衡

upstream负载平衡机制:

轮询-向应用服务器的请求以循环方式分发:(默认配置为轮询)

http {    upstream myapp1 {        server srv1.example.com;        server srv2.example.com;        server srv3.example.com;    }    server {        listen 80;        location / {            proxy_pass http://myapp1;        }    }}

最少连接 - 下一个请求被分配给具有最少数量的活动连接的服务器:

 upstream myapp1 {        least_conn;        server srv1.example.com;        server srv2.example.com;        server srv3.example.com;    }

ip-hash - 哈希函数用于确定下一个请求应该选择哪个服务器(基于客户端的IP地址)。

upstream myapp1 {    ip_hash;    server srv1.example.com;    server srv2.example.com;    server srv3.example.com;}

upstream参数说明:

weight=1 #服务器的权重,越大越高,默认为1

max_conns=1 #限制与代理服务器同时活动链接的最大值,默认为0

max_fails=1 #与服务器连接失败的次数内将服务器变为不可用,与fail_timeout一起使用,默认为1

fail_timeout=10 #指定次数连接不成功内考虑服务器不可用大时间

backup #将服务器标记为备份服务器

down #将服务器标记为永久不可用

以反向代理为例, nginx不自己处理php的相关请求,而是把php的相关请求转发给apache来处理.

反向代理后端如果有多台服务器,自然可形成负载均衡,

但proxy_pass如何指向多台服务器?

把多台服务器用upstream指定绑定在一起并起个组名,然后proxy_pass指向该组:

将图片服务器做反向代理和负载均衡:

#user  nobody;worker_processes  1;#error_log  logs/error.log;#error_log  logs/error.log  notice;#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';    #access_log  logs/access.log  main;    sendfile        on;    #tcp_nopush     on;    #keepalive_timeout  0;    keepalive_timeout  65;    upstream imagserver{     #配置负载均衡服务器  server 172.16.32.100:81 weight=1 max_fails=3 fail_timeout=10;  server 172.16.32.100:82 weight=1 max_fails=3 fail_timeout=10;}    server {listen81;server_namelocalhost;location / {  root html;  index index.php index.html index.htm;  access_log logs/81_access.log main; }    }    server {listen82;server_namelocalhost;location / {  root html;  index index.php index.html index.htm;  access_log logs/82_access.log main;}    }    server {        listen       80;        server_name  localhost;    gzip  on;    gzip_buffers 32 4k;    gzip_comp_level 6;    gzip_types text/plain p_w_picpath/jpeg application/xml;    gzip_vary on;        #charset koi8-r;        #access_log  logs/host.access.log  main;        location / {            root   html;            index  index.php index.html index.htm;        }location ~* \.(jpg|jpeg|gif|png){   #配置反向代理,将图片请求转发到服务器组    proxy_set_header X-Forwarded-For $remote_addr; #将客户端请求IP传递到代理服务器日志$http_x_forwarded_for    proxy_pass  http://imagserver;}        #error_page  404              /404.html;        # redirect server error pages to the static page /50x.html        #        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000        #        location ~ \.php$ {            root           html;            proxy_set_header X-Forwarded-For $remote_addr;            fastcgi_pass   127.0.0.1:9000;            include        fastcgi.conf;        }}

---------------------------------end-------------------------------------------------------

0