Linux安装:nginx

1、安装

1.1、docker安装

下载nginx镜像

docker pull docker.io/nginx

启动默认nginx镜像

docker run -d -p 80:80 --name nginx docker.io/nginx

复制nginx相关配置

# 复制配置文件
docker cp nginx:/etc/nginx/nginx.conf /opt/nginx/nginx.conf

# 复制conf.d
docker cp nginx:/etc/nginx/conf.d /opt/nginx/conf.d

停止并移除nginx镜像

# 停止镜像
docker stop nginx

# 移除镜像
docker rm nginx

重新启动nginx镜像

docker run --name nginx -d \
-p 80:80  \
--restart=always \
-v /etc/localtime:/etc/localtime \
-v /opt/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /opt/nginx/conf.d:/etc/nginx/conf.d \
-v /opt/nginx/html:/usr/share/nginx/html \
-v /opt/nginx/logs:/var/log/nginx \
docker.io/nginx

 

1.2、yum安装

检查是否可以在yum源中找到

yum info nginx

如果输出nginx版本号则证明可以,否则需要增加yum源
增加yum源:
# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安装nginx

yum install -y nginx

启动Nginx

systemctl start nginx

正常情况下,就可以通过IP访问了,检查是否开放了防火墙端口

 

2、配置

2.1、nginx基本配置

网站文件存放默认目录

/usr/share/nginx/html

网站默认站点配置

/etc/nginx/conf.d/default.conf

自定义Nginx站点配置文件存放目录

/etc/nginx/conf.d/

Nginx全局配置

/etc/nginx/nginx.conf

配置优化

vi /etc/nginx/nginx.conf

worker_processes  1;
--------------
默认:1
可以设为和CPU的数量一样:2核4线程,可以设置为4
一般情况下开4个或8个就可以了,再往上开的话优化不太大
如果网站没有出现io性能问题,最好不要修改,采用默认的1即可,
如果非要设置,必须要和CPU的内核数匹配,否则要么就假死(主要是Windows),要么就出现502的错误(主要是Linux)。
--------------------

worker_rlimit_nofile 65535;
--------------------
配合worker_connections
worker_rlimit_nofile配置要和系统的单进程打开文件数一致,千万不要再画蛇添足地除以worker_processes。
我现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。
这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,
总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
------------------

events {  
    #使用网络IO模型,linux建议epoll,FreeBSD建议采用kqueue,window下不指定。  
    #use epoll;  

    #允许最大连接数,根据实际并发调整
    worker_connections 65535;
}  

http { 
    client_max_body_size   20m;
    #附件传输大小限制,可以在http、server、location中的任何一个节点

}

-------------------
原作者的话:
1、一般一个进程足够了,你可以把连接数设得很大。(worker_processes: 1,worker_connections: 10,000)
2、如果有SSL、gzip这些比较消耗CPU的工作,而且是多核CPU的话,可以设为和CPU的数量一样。(worker_processes: CPU核心数)
3、或者要处理很多很多的小文件,而且文件总大小比内存大很多的时候,也可以把进程数增加,以充分利用IO带宽(主要似乎是IO操作有block)

worker_connections解析:
1.connections不是随便设置的,而是与两个指标有重要关联,一是内存,二是操作系统级别的“进程最大可打开文件数”。
2.内存:每个连接数分别对应一个read_event、一个write_event事件,一个连接数大概占用232字节,2个事件总占用96字节,那么一个连接总共占用328字节,通过数学公式可以算出100000个连接数大概会占用 31M = 100000 * 328 / 1024 / 1024,当然这只是nginx启动时,connections连接数所占用的nginx。
3.进程最大可打开文件数:进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询,以前是1024,现在是65535,
nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值,如:worker_rlimit_nofile 20960;
设置ulimits:ulimit -SHn 65535

 

2.2、nginx基本命令

查看版本号

nginx -v

#更加详细的信息(包括加载的模块)
nginx -V

测试配置文件是否有语法错误

nginx -t

重新加载配置文件

nginx -s reload

 

2.3、开启gzip模块

检查是否加载gzip模块

nginx -V

查看是否有--with-http_gzip_static_module模块

修改配置文件

vi /etc/nginx/nginx.conf 

可以配置在http节点下,也可以配置在server节点下的location节点,例如:
location / {
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    #gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\.";
    #gzip on; 该指令用于开启或关闭gzip模块(on/off)
    #gzip_min_length 设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。
    #gzip_buffers 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存。
    #gzip_http_version 识别http的协议版本(1.0/1.1)
    #gzip_comp_level gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)
    #gzip_types 匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。
    #gzip_vary 和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩。跟Squid等缓存服务有关,on的话会在Header里增加"Vary: Accept-Encoding"
    #gzip_disable IE6对Gzip不怎么友好,不给它Gzip了
}

 

2.4、配置tomcat转发

配置单台tomcat转发

vi /etc/nginx/conf.d/default.conf

server {
    listen       80;
    server_name  localhost;
    location / {
        proxy_pass http://192.168.1.99:8080/;
        #proxy_set_header Host $host;
        #proxy_set_header X-Real-IP $remote_addr;
        #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        ......
    }
    ......
}

配置tomcat负载均衡

vi /etc/nginx/conf.d/default.conf

  #负载均衡器
  upstream tomcatServer {  
    server 127.0.0.1:8080 weight=3;
    server 127.0.0.1:8081 weight=7;    
    server 127.0.0.1:8083 down;        
    server 127.0.0.1:8084 backup; 
  }
  server { 
    listen 80;
    server_name  localhost;
    location / {  
        proxy_pass  http://tomcatServer; 
        ......
    }
    ......
  }

#down表示当前的服务暂不参于负载
#backup 其它所有非backup机器down或者忙时,才会请求backup机器。

负载均衡器有如下几种规则:

2.4.1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

#负载均衡器
  upstream tomcatServer {  
    server 127.0.0.1:8080;
    server 127.0.0.1:8081; 
  }

2.4.2、权重(weight)

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。权重越高,在被访问的概率越大,如上例,分别是30%,70%。

#负载均衡器
  upstream tomcatServer {  
    server 127.0.0.1:8080 weight=3;
    server 127.0.0.1:8081 weight=7;  
  }

2.4.3、根据IP分配(ip_hash)

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

#负载均衡器
  upstream tomcatServer {  
    ip_hash;
    server 127.0.0.1:8080 weight=3;
    server 127.0.0.1:8081 weight=7;  
  }

2.4.4、响应时间(fair)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

#负载均衡器
  upstream tomcatServer {  
    fair;
    server 127.0.0.1:8080 weight=3;
    server 127.0.0.1:8081 weight=7;  
  }

2.4.5、URL(url_hash)

每个url定向到同一个后端服务器

#负载均衡器
upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}

 

2.5、配置重定向

2.5.1、语法规则

可以用在server、location、if三类节点中

语法:

rewrite regex replacement[flag];
rewrite 正则表达式 目标URL flag类型;

如:顶级域名定向到www域名

server{
        listen 80;
        server_name localhost.com;
        rewrite ^/(.*) http://www.localhost.com/$1 permanent;
    }

flag类型:

标记符号 说明
last 本条规则匹配完成后继续向下匹配新的location URI规则
break 本条规则匹配完成后终止,不在匹配任何规则
redirect 返回302临时重定向
permanent 返回301永久重定向

正则表达式规则符:

字符 描述
\ 将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或者多次
+ 匹配前面字符串一次或者多次
? 匹配前面字符串的零次或者一次
. 匹配除“\n”之外的所有单个字符
(pattern) 匹配括号内的pattern

 

2.6、目录浏览

开放其中一个目录的目录浏览

location /file/ {
        alias /usr/share/nginx/html/file/;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
        charset utf-8,gbk;
    }

# 注意:目录配置为 alias
# charset:解决中文乱码问题

配置浏览器直接打开log日志,在mime.types文件的txt行中增加log文件

docker cp nginx91:/etc/nginx/mime.types ./

text/plain                     txt log;

2.7、HTTP连接超时

配置文件中找到 http、server 或 location 块,这取决于您需要在哪个层级设置超时参数。如果需要为整个服务器设置超时时间,请在 http 块中设置。如果需要为特定虚拟主机设置超时时间,请在 server 块中设置。如果仅针对特定位置设置超时时间,请在 location 块中设置。

    keepalive_timeout  3000;
    proxy_connect_timeout 300s;
    proxy_read_timeout 300s;
    fastcgi_connect_timeout 3000;
    fastcgi_send_timeout 3000;
    fastcgi_read_timeout 3000;

proxy与fastcgi的区别

  • proxy_connect_timeout
    参数用于设置 Nginx 作为反向代理服务器与后端 HTTP 服务器建立连接的最大等待时间。当 Nginx 代理 HTTP 请求时,这个参数控制 Nginx 连接到上游服务器的时间。如果在指定的时间内无法建立连接,Nginx 会返回一个错误。
  • fastcgi_connect_timeout
    参数用于设置 Nginx 与后端 FastCGI 服务器建立连接的最大等待时间。当 Nginx 与 FastCGI 服务器(如 PHP-FPM)通信时,这个参数控制 Nginx 连接到 FastCGI 服务器的时间。如果在指定的时间内无法建立连接,Nginx 会返回一个错误。
location ~ \.php$ {
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_connect_timeout 300s;
}