nginx安装和配置

编译安装nginx

#安装前需要先准备好编译环境,和nginx需要的组件
[root@nginx ~]# yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y

#下载需要安装的版本号
https://nginx.org/en/download.html

#解压源码包
[root@nginx ~]# tar -zxvf nginx-xxx.tar.gz

#进入解压目录,简单配置并安装
[root@nginx ~]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
[root@nginx ~]# make && make install

#启动nginx
[root@nginx ~]# /usr/local/nginx/sbin/nginx

#重载配置
[root@nginx ~]# /usr/local/nginx/sbin/nginx -s reload

#停止nginx
[root@nginx ~]# /usr/local/nginx/sbin/nginx -s stop

#检查配置文件
[root@nginx ~]# /usr/local/nginx/sbin/nginx -t

yum安装nginx

#配置nginx yum源,系统需要要换成对应的系统
[root@test ~]# vi /etc/yum.repos.d/nginx.repo 
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

#安装
[root@test ~]# yum install nginx

nginx目录结构

conf 存放nginx所有配置文件的目录,主要nginx.conf
html 存放nginx默认站点的目录,如index.html、error.html等
logs 存放nginx默认日志的目录,如error.log access.log
sbin 存放nginx主程序的目录,sbin/nginx

  整体配置文件

#定义Nginx运行的用户
user nobody;   

#nginx进程数,通常为物理cpu核心数-1。
worker_processes 8;  
 
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /usr/local/nginx/logs/error.log info;

#进程pid文件
pid /usr/local/nginx/logs/nginx.pid;

#指定进程可以打开的最大描述符个数,通常为ulimit -n的值
worker_rlimit_nofile 65535;


events
{
	#默认使用epoll模型
    use epoll;

    #单个进程最大连接数(最大连接数=连接数*进程数)
    worker_connections 65535;

    #keepalive超时时间。
    keepalive_timeout 60;

    #客户端请求头部的缓冲区大小。通常为getconf PAGESIZE取得的结果
    client_header_buffer_size 4k;

    #这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
    open_file_cache max=65535 inactive=60s;

    #这个是指多长时间检查一次缓存的有效信息,默认60s
    open_file_cache_valid 60s;

    #指明缓存inactive时间没有用过多少次就删掉,默认1次
    open_file_cache_min_uses 1;
    
    #这个指令指定是否在搜索一个文件是记录cache错误,默认off
    open_file_cache_errors on;
}
 
http
{
    #包含这个文件,文件扩展名与文件类型映射表
    include mime.types;

    #默认文件类型
    default_type application/octet-stream;

    #默认编码
    charset utf-8;

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

    #客户端请求头部的缓冲区大小。
    client_header_buffer_size 32k;

    #客户端请求头缓冲大小。
    large_client_header_buffers 4 64k;

    #限制通过nginx上传文件的大小
    client_max_body_size 8m;

    #开启高效文件传输模式,同时开启下面选项
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
	
    #开启目录列表访问,合适下载服务器,默认off。
    autoindex off;

    #长连接超时时间,单位是秒
    keepalive_timeout 120;

    #FastCGI相关参数
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #gzip模块设置
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k;    #最小压缩文件大小
    gzip_buffers 4 16k;    #压缩缓冲区
    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;   #压缩哪种文件
    gzip_vary on;

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

    #负载均衡配置
    upstream 负载组名1 {
        #轮询机制,weight是权重,值越高负载几率越大
        server 192.168.1.1:80 weight=3;
        server 192.168.1.2:80 weight=2;
        server 192.168.1.3:80 weight=3 down;  #关闭状态
		server 192.168.1.4:80 weight=3;
		server 192.168.1.5:80 weight=3 backup;#当其他服务器都坏掉才使用这个
		}
	upstream 负载组名2 {
        #源地址hash机制,按照请求ip的hash结果分配,每个访客可以固定访问一个后端服务器
		ip_hash;
        server 192.168.1.1:80;
        server 192.168.1.2:80;
        }
	upstream 负载组名3 {
        #响应时间机制,按后端服务器的响应时间来分配请求,响应时间短的优先分配。
        server 192.168.1.1:80;
        server 192.168.1.2:80;
        fair;
        }
    upstream 负载组名4 {
		#访问url hash机制,按照目标url的hash结果分配
         server squid1:3128;
         server squid2:3128;
         hash $request_uri;
         hash_method crc32;
        }
     
    server
    {
        #监听端口
        listen 80;

        #域名可以有多个,用空格隔开
        server_name www.a.cn b.cn;
		
		#网站默认首页
        index index.html index.htm index.php;
		
		#网站页面存放路径
        root html;
         
        #图片缓存时间设置
		
        #日志格式设定
        #$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
        #$remote_user:用来记录客户端用户名称;
        #$time_local: 用来记录访问时间与时区;
        #$request: 用来记录请求的url与http协议;
        #$status: 用来记录请求状态;成功是200,
        #$body_bytes_sent :记录发送给客户端文件主体内容大小;
        #$http_referer:用来记录从那个页面链接访问过来的;
        #$http_user_agent:记录客户浏览器的相关信息;
        #通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';
         
        #定义本虚拟主机的访问日志
        access_log  /usr/local/nginx/logs/host.access.log  main;
        access_log  /usr/local/nginx/logs/host.access.404.log  log404;
         
        #对 "/" 启用反向代理
        location / {
			#代理至http段的负载
            proxy_pass http://负载组名;
            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;

            #表示使nginx阻止HTTP应答代码为400或者更高的应答。
            proxy_intercept_errors on;

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

            #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
            proxy_send_timeout 90;

			#后端服务器处理请求的时间
            proxy_read_timeout 90;

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

            #设置用于读取应答(来自被代理服务器)的缓冲区数目和大小
            proxy_buffers 4 32k;

            #高负荷下缓冲大小(proxy_buffers*2)
            proxy_busy_buffers_size 64k;
        }
                
        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file confpasswd;
            #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
        }
         
        #本地动静分离反向代理配置
        #所有jsp的页面均交由tomcat或resin处理
        location ~ .(jsp|jspx|do)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8080;
        }
         
        #所有静态文件由nginx直接读取不经过tomcat或resin
        location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        {
            expires 15d; 
        }
         
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
    }
}

  

  

 

主配置段指令

正常运行的必备配置
1.user USERNAME [GROUPNAME];指定运行worker进程的用户和组,组省略代表跟用户名一样的组
2.pid /PATH/TO/PID_FILE;指定nginx守护进程的pid文件
3.worker_rlimit_nofile #;指定所有worker进程所能打开的最大文件数

性能优化的相关配置
1.worker_processes #; 指定worker进程的个数,通常为cpu物理核心-1个
2.worker_cpu_affinity CPU掩码 ;进程与cpu绑定,能够提升cpu缓存命中率
3.timer_resolution #; 计时器解析度,降低会提升性能
4.worker_priority #;指定worker进程的nice值
事件的相关配置
1.accept_mutex on|off;主进程调度用户请求至各工作进程使用的负载均衡锁,on表示能让多个工作进程轮流、有序的响应新请求
2.lock_file /PATH/TO/FILE;上面那个锁的路径
3.use [epoll|rtsig|select|poll];知名使用的事件模型,建议让nginx自行选择
4.worker_connections #;设定单个工作进程所能够处理的并发连接数量
调试、定位问题
1.daemon [on|off];是否以守护进程方式来运行nginx,调试时设置为off,会出现信息
2.master_process [on|off];是否以master/worker模型来运行nginx,调试时可以设置为off
3.error_log 记录位置 级别;记录日志,若要使用debug级别,需要在编译nginx时使用了--with-debug选项

http配置段

[root@test nginx]# grep -v "#" conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  www.a.com;
        location / {
            root   /www;
            index  index.html index.htm;
        }
	location /status {
		stub_status on;
	}
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

1.listen:监听地址或端口

2.sever_name:设置网站名,同时可以设置网站别名,用空格隔开

3.root:定义网页目录,可以用于server,location字段,右侧斜线"/"必须同时有或没有

location /aaa/{
       root   /nginx/www/   #访问aaa相当于/nginx/www/aaa
}

 4.alias:用于location配置段,定义路径别名,右侧斜线"/"必须同时有或没有

location /bbb/{
       alisa /nginx/www/    #访问aaa相当于/nginx/www
}

 5.server_name匹配方法:
  (1)先做精确匹配检查
  (2)左侧通配符匹配检查,*.a.com
  (3)右侧通配符匹配检查,www.*
  (4)正则表达式匹配检查,
  (5)默认虚拟主机

6.location [ = | ~ | ~* | ^~ ] URI { ... }:根据用户请求的URI做处理
  =:精确匹配检查,最高优先级
  ^~:URI的前半部分匹配,不支持正则表达式
  ~:正则表达式模式匹配检查,区分字符大小写
  ~*:正则表达式模式匹配检查,不区分字符大小写
  无符号:最低优先级

7.index:默认主页面
  index index.php index.html;

8.根据http响应的状态码来指定错误页面:error_page # # [=#] /PATH/TO/FILE:
  error_page 400 404 =100 100_error.html; 当http回应400或404状态码时,将他重置为100,并返回当前目录下100_error.html页面

9.基于ip的访问控制
  allow IP/NETWORK; 
  deny IP/NETWORK;   

10.基于账号的认证
  auth_basic "";    输入密码的提示
  auth_basic_user_file "/PATH/TO/PASSWORD_FILE" 密码文件可以使用htpasswd创建

11.https服务

#server {
        listen       443 ssl;
        server_name  localhost;
        ssl_certificate      cert.pem;   #指定证书
        ssl_certificate_key  cert.key;  #指定证书私钥
        location / {
            root   html;
            index  index.html index.htm;
        }
    }

12.状态信息

 location /status {
                stub_status on;
                allow 172.17.148.112;
                deny all;
        }

13.状态信息解释

Active connections: 1                         #当前所有处于打开状态的连接数
server accepts handled requests         
 13 13 25 
#已经接受过的连接数
#已经处理过的连接数
#已经处理过的请求数,keepalive模式下,请求数量会多于连接数量
Reading: 0 Writing: 1 Waiting: 0 
#正处于接收请求状态的连接数
#请求已经接收完成,正处于处理请求或发送响应的过程中的连接数
#keepalive模式处于活动状态的连接数

14.URL重写rewrite 正则  替换内容  标志

  rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;

  例:www.a.com/images/a/b.jpg就会换成www.a.com/imgs/a/b.jpg
  标志:
    last:会在location内一直循环匹配,直到都匹配完成才结束
    break:替换一次就不会再替换了
    redirect:以302响应码临时重定向返回新的URL
    permanent:以301响应码永久重定向返回新的URL
15.if (表达式) {}   条件判断可以应用在srever、location
  (1)变量名:变量名为空或者为0,则为false;其他的都为true
  (2)比较表达式:=,>,<,!=类似的比较字符串进行比较
  (3)正则表达式:~区分大小写,~*不区分大小写
  (4)是否为文件:-f,!-f
  (5)是否为目录:-d,!-d
  (6)文件是否存在:-e,!-e
  (7)文件是否有执行权限:-x,!-x
  例:if ($http_usr_agent ~* MSIE){
      rewrite ^(.*)$ /msie/$1 break;  假如浏览器类型为微软,就定向到msie目录下
      }  

16.定制访问日志,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"';
 access_log  logs/access.log  main;
##log_format:用来定义记录日志的格式,取不同名字即可
##main:定义后面日志的名字
##access_log:用来指定日志文件的路径及使用哪种格式进行记录 
##$remote_addr:记录访问网站的客户端地址
##$remote_user:远程客户端用户名称
##$time_local:用户访问时间与时区
##$request:用户的http请求起始行信息
##$status:记录请求返回的状态码
##$body_bytes_sent:服务器发送给客户端的响应主体字节数
##$http_referer:记录此次请求时由哪个链接跳转而来
##$http_user_agent:用户的浏览器类型
##$http_x_forwarded_for:当前端是代理服务器时,记录由哪个代理转发而来    

 

16.1错误日志

error_log   /var/log/nginx/error.log   warn;
##可以配置在main,http,server,location段。
##错误日志级别有debug、info、notice、warn、error、crit、alert、emerg
##错误日志默认级别为error,配置较低等级会导致大量磁盘I/O    

17.实现反向代理

location / {
      proxy_pass http://172.17.148.255/;     #将访问的所有数据都代理给后面的
      proxy_set_header ahost $proxy_host;   #传送代理主机的ip,为了记录日志
      proxy_set_header bhost $http_host;     #从哪个代理过来的ip+端口
      proxy_set_header Host  $host;       #当有多个虚拟主机时,代理服务器可以识别访问的是哪个虚拟主机
      proxy_set_header dhost $proxy_port;    #从哪个代理过来的端口
      proxy_set_header X-Forwarded-For $remote_addr;  #真实请求的主机ip
    }
location /nginx.txt {
        proxy_pass http://172.17.148.255/nginx/nginx.txt;   #将匹配到的内容定向后面
        }
location  ~* \.(jpgg|pngg)$ {     #假如这里是根据正则匹配的↓
        proxy_pass http://172.17.148.255;  #下面这里不能加任何路径,因为会在路径后面补全前面匹配到的内容
        }

 #######定义完传送的日志名称后,需在在后端服务器上修改对应的日志格式,以后端httpd为例
LogFormat "%{ahost}i %{bhost}i %{chost}i %{dhost}i %{ehost}i" combined

18.定义缓存

http {
proxy_cache_path /cache/nginx levels=1:1:1 keys_zone=mycache:10m;
}
#定义缓存必须在http段,/cache/nginx/目录必须为worker进程的属主属组
#levels代表有几个层级目录,最多3层,1:1:1代表有三层目录,1代表目录名最多一个字符
#keysz_zone代表缓存名称,后面引用的时候会用,大小为10M

19.使用缓存

location / {
        proxy_cache mycache;             #定义使用的缓存空间
        proxy_cache_valid 200 1m;      #状态码为200缓存1分钟
        proxy_cache_valid 301 302 10m;   #状态码为301 302 缓存10分钟
        proxy_cache_valid any 1m;      #状态码为其他缓存1分钟
        proxy_cache_methods GET  HEAD    #设置http请求方法为get或head时才使用缓存 
    proxy_cache_use_stale error  timeout    #当后方服务器为什么状态时可以使用过期的缓存
       proxy_cache_min_uses 2;           #同一资源使用几次后才缓存
       proxy_cache_bypass $ cookie_nocache $ arg_nocache $ arg_comment;    #定义不从缓存中获取响应的条件
       proxy_set_header ehost $remote_addr;  #真实请求的主机ip
       proxy_pass http://172.17.148.255/;    
}  

 20.负载均衡,服务器组

upstream backend {            #定义服务器组,只能在http段定义 
    server 10.1.1.1  weight=2;  #设置权重为2,默认权重为1
    server 10.1.1.2:8080;    #可以加端口
    server 10.1.1.3  fail_timeout=5s max_fails=3;  #最多尝试3次,超时后每5秒检查一次
    server 10.1.1.4  backup;   #备份服务器,当其他节点都不可用时,才用这个
    server 10.1.1.5  down;      #标致服务器状态为不可用
    server 10.1.1.6  weight=1 max_fails=1 fail_timeout=10s;  #默认配置
    server  www.abc.com:8080;  #同时可以使用域名加端口的方式  
}
server {
    listen 80;
    server_name   www.aaa.com;
    location / {
        proxy_pass http://backend;       #当访问www.aaa.com时,发送给上面定义的服务器组
    }
} 

21.session保持

upstream  keepsession{
       ip_hash;    
       server 10.1.1.1;
       server 10.1.1.2;  
}
##ip_hash,根据源ip进行会话保持,后端服务器在负载均衡调度中的状态不能有weight和backup
##fair,根据后端服务器的响应时间
##least_conn,根据后端服务器节点的连接数
##hash $request_rui,根据访问的URL
##consistent_hash $request_rui,一致性hash

  

  

  

  

 

 网络相关的配置

1.keepalive_timeout #;  长连接超时时长,默认75秒
2.keepalive_request #; 在一个长连接上所能够允许请求的最大资源数
3.keepalive_disables [msie6|safari|none]; 为指定类型浏览器禁用长连接
4.tcp_nodelay on | off; 是否对长连接使用延迟功能
5.client_hearder_timeout #; 读取http请求报文首部超时时长
6.client_body_timeout #;读取http请求报文body部分超时时长
7.send_timeout #;发送响应报文的超时时长

 fastcgi相关配置

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;
        } 

 

相关优化

1.隐藏nginx的版本号信息

http {
        server_tokens off;   #隐藏版本号
} 
##可以放置在http、server、location段中,默认配置为on

2.进程数和cpu绑定

##假设单颗四核心cpu
http{
worker_processes  4;
worker_cpu_affinity  0001  0010  0100  1000;
}
##配置4个工作进程,把这四个进程分别绑定到cpu的4个核心上
http{
worker_processes  2;
worker_cpu_affinity  0101  1010;
}
##配置2个工作进程,把第一个进程分配到1、3cpu上,把第二个进程分配到2、4cpu上

3.单个进程最大连接数

events {
    worker_connections  1024;
}
##最大连接数=工作进程个数*单个进程做大连接数

4.连接超时设置

###都可以在http、server、location中做
keepalive_timeout 60;  #长连接超时时间
client_header_timeout 60; #超过多长时间还没收到客户端的请求头部就断开
client_body_timeout 60; #超过多长时间还没收到客户端的请求主体就断开
send_timeout 60; #客户端如果超过多长时间没有接收数据就断开

5.上传文件大小的限制

###可以放置在http、server、location段
client_max_body_size  1m;  #如果客户端请求主体大小超过1m,就返回413错误

6.压缩功能

#####压缩文本文件,图片和视频不要压缩
gzip on;   #开启压缩功能
gzip_min_length  1k;   #设置低于1k的文件不压缩,如果压缩低于1k的文件可能会变大
gzip_comp_level  2;  #设置压缩比,1压缩比最小,压缩速度最快;9压缩比最大,压缩速度最慢
gzip_types  text/html text/css text/xml;设置哪些类型的文件被压缩
gzip_vary on;

7.错误页面优雅显示

error_page  400 401 402 403 404  =200  /error.html
##当返回状态码为40...时,重置为200,并返回/error.html页面
error_page  500 501   http://www.abc.com
##当返回状态码为50..时,返回这个网页

  

·  

  

  

  

  

  

  

  

 

 

你可能感兴趣的:(nginx安装和配置)