Nginx安装配置及调优

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx安装配置及调优相关的知识,希望对你有一定的参考价值。

Nginx安装配置及调优

?

一、安装nginx

?

1.安装环境

[[email protected] ~]# yum –y install gcc pcre-devel openssl-devel

2.创建一个用户启动nginx

[[email protected] ~]# useradd –s /sbin/nologin nginx

3.安装(不用的装模块不装)

[[email protected] nginx-1.12.2]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-stream \
--with-http_stub_status_module
?
--prefix??//指定安装路径
--user ??//指定用户
--group??//指定组
--with-http_ssl_module ?//开启SSL加密功能
--with-stream?????//开启反向代理功能
--with-http_stub_status_module ?//开启status状态页面

4.编译并安装

[[email protected] nginx-1.12.2]# make && make install

5.放入PATH变量方便使用

[[email protected] ~]# ln -s /usr/local/nginx/sbin/nginx /sbin/

?

二、升级或者更改Nginx模块

?

1.编译新的Nginx

[[email protected] nginx-1.12.2]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module
[[email protected] nginx-1.12.2]# make

2.拷贝新版本

[[email protected] nginx-1.12.2]# cp objs/nginx /usr/local/nginx/sbin/

3.升级后测试

[[email protected] nginx-1.12.2]# make upgrade

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

4.查看版本

[[email protected] ~]# /usr/local/nginx/sbin/nginx -v

?

三、将Nginx加入systemd管理开机自启

?

1.编写nginx.service文件

[[email protected] systemd]# vim /usr/lib/systemd/system/nginx.service

[Unit]                                      #服务的说明
Description=nginx                   #描述服务
After=network.target              #在network服务后启动
Wants=php-fpm.service         #如果不要求php可不加
[Service]
Type=forking                                                   #是后台运行的形式    
ExecStart=/usr/local/nginx/sbin/nginx               #指定启动nginx的命令的脚本
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true                                         #给服务分配独立的临时空间
[Install]
WantedBy=multi-user.target                            #默认

2.管理命令

[[email protected] ~]# systemctl start / stop / restart / enable nginx

四、配置文件

?

1.设置页面密码登录

1 ) 修改配置文件

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
```.. ..
server {
listen 80;
server_name localhost;
auth_basic "Input Password:"; #认证提示符
auth_basic_user_file "/usr/local/nginx/pass"; #认证密码文件
location / {
root html;
index index.html index.htm;
}
}

2 )生成密码文件,创建用户tom及密码

[[email protected] ~]# yum -y install httpd-tools
//创建密码文件
[[email protected] ~]# htpasswd -c /usr/local/nginx/pass tom

New password: 
Re-type new password: 
Adding password for user tom

//追加用户,不使用-c选项
[[email protected] ~]# htpasswd /usr/local/nginx/pass jerry (不要 -c)

New password: 
Re-type new password: 
Adding password for user jerry

[[email protected] ~]# cat /usr/local/nginx/pass

3 )重启验证

[[email protected] nginx-1.12.2]# firefox 127.0.0.1

技术分享图片

?

2.配置SSL虚拟主机

?
1)生成私钥与证书

[[email protected] ~]# cd /usr/local/nginx/conf
//生成私钥
[[email protected] ~]# openssl genrsa > cert.key
//生成证书
[[email protected] ~]# openssl req -new -x509 -key cert.key > cert.pem

Country Name: CN                      //您所在国家的ISO标准代号,中国为CN
State or Province Name:guandong       //您单位所在地省/自治区/直辖市
Locality Name:guangzhou                 //您单位所在地的市/县/区
Organization Name: Test                 //您单位/机构/企业合法的名称 
Organizational Unit Name: Test        //部门名称 
Common Name: www.test.com        //通用名,例如:www.itrus.com.cn。此项必须与您访问提供SSL服务的服务器时所应用的域名完全匹配。
Email Address:                              //您的邮件地址,不必输入,直接回车跳过

2 ) 修改Nginx配置文件(最后),设置加密网站的虚拟主机

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf

… …    
server {
listen       443 ssl;                                 #端口
server_name            www.cc.com;         #访问的域名
ssl_certificate      cert.pem;                   #公钥
ssl_certificate_key  cert.key;                 #私钥
ssl_session_cache    shared:SSL:1m;
ssl_session_timeout  5m;
ssl_ciphers  HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers  on;
location / {
root   html;
index  index.html index.htm;
}
}

3)访问测试

[[email protected] ~]# firefox https://127.0.0.1

技术分享图片
(成功)
?

3.配置没网页也能打开页面

1)修改配置文件

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf

server {
listen       80;
server_name  localhost;
location /  {
root   test;                                      #访问的nginx根路径
index   index.html index.htm;          #可以不写
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

2 ) 创建测试的文件目录

[[email protected] nginx]# mkdir /usr/local/nginx/test
[[email protected] nginx]# touch /usr/local/nginx/test/1.txt

3 )重启服务验证

技术分享图片

?

4.地址重写

1 )访问a.html重定向到b.html

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf

.. ..
server {
listen       80;
server_name  localhost;
location / {
root   html;
index  index.html index.htm;
rewrite /a.html  /b.html;            
}}

2 )访问本机地址的请求重定向至www.baidu.com

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf

.. ..
server {
listen       80;
server_name  localhost;
rewrite ^/ http://www.baidu.com/;
#rewrite ^/(.*) http://www.baidu.cn/$1;          重定向至www.baidu.com/下相同的页面
location / {
root   html;
index  index.html index.htm;
}}

3 ) 实现curl和火狐访问相同链接返回的页面不同

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf

server {
listen       80;
server_name  localhost;
location / {
root   html;
index  index.html index.htm;
if ($http_user_agent ~\* firefox) { rewrite ^(.*)$ /firefox/$1 break; }            #识别客户端firefox浏览器(#加*不区分大小写)
#if ($http_user_agent ~* firefox) { rewrite .* /firefox/index.html break; }
}
#last        不再读其他rewrite
#break      不再读其他语句,结束请求
#redirect   临时重定向
#permament  永久重定向

?

5.部署后端web服务器

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf

.. ..
http {
.. ..
upstream webserver {               #设置一个webserver的池
#ip_hash;                 #设置相同客户端访问相同Web服务器
server 192.168.2.100 weight=1 max_fails=2 fail_timeout=10;
server 192.168.2.200 weight=2 max_fails=2 fail_timeout=10;
}
#max_fails=允许失败的次数
#fail_timeout=失败后多少秒不连接
#weight=访问比例

?

6.实现TCP/UDP调度器功能(with-stream模块)

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf

stream {
upstream backend {
server 192.168.2.100:22;            #后端SSH服务器的IP和端口
server 192.168.2.200:22;
}
server {
listen 12345;                               #Nginx监听的端口
proxy_connect_timeout 1s;          #超时时间
proxy_timeout 3s;                             #限制无操作断开
proxy_pass backend;
}
}
http {
.. ..
}

?

五、Nginx调优

?

1.屏蔽Nginx版本信息

1 )修改配置文件

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf

stream {
.. ..
http {
server_tokens off;                    //不显示nginx版本号信息
.. ..
}

2)测试页面(修改前)

[[email protected] nginx-1.12.2]# curl -I 127.0.0.1

HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Fri, 01 Jun 2018 11:39:31 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Thu, 31 May 2018 09:49:05 GMT
Connection: keep-alive
ETag: "5b0fc511-264"
Accept-Ranges: bytes

(修改后)

HTTP/1.1 200 OK
Server: nginx
Date: Fri, 01 Jun 2018 11:39:31 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Thu, 31 May 2018 09:49:05 GMT
Connection: keep-alive
ETag: "5b0fc511-264"
Accept-Ranges: bytes

3)隐藏使用的软件为nginx(修改源码包安装文件)

[[email protected] nginx-1.12]# vim +48 /nginx-1.12/src/http/ngx_http_header_filter_module.c

static u_char ngx_http_server_string[] = "Server: nginx" CRLF;
static u_char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
static u_char ngx_http_server_build_string[] = "Server: " NGINX_VER_BUILD CRLF;
//下面是我们修改后的效果:
static u_char ngx_http_server_string[] = "Server: Jacob" CRLF;
static u_char ngx_http_server_full_string[] = "Server: Jacob" CRLF;
static u_char ngx_http_server_build_string[] = "Server: Jacob" CRLF;

4 )修改完成后,再去编译安装Nignx,版本信息将不再显示为Nginx,而是Jacob

2.增加Nginx增加并发量

1 )修改Nginx配置文件,增加并发量

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf

.. ..
worker_processes  2;                 #与CPU核心数量一致
events {
worker_connections 65535;        #每个worker最大并发连接数
use epoll;
}

2 )优化Linux内核参数(最大文件数量 )

[[email protected] ~]# ulimit -Hn 100000
[[email protected] ~]# ulimit -Sn 100000
\\永久生效写进配置文件
[[email protected] ~]# vim /etc/security/limits.conf

\*               soft    nofile            100000
\*               hard    nofile            100000

3)优化后测试服务器并发量
[[email protected] ~]# ab –n 2000 –c 2000 http://127.0.0.1/

3.限制并发量

DDOS×××者会发送大量的并发连接,占用服务器资源(包括连接数、带宽等),这样会导致正常用户处于等待或无法访问服务器的状态,Nginx提供了一个ngx_http_limit_req_module模块,可以有效降低DDOS×××的风险。
1 ) 修改配置文件

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf

… …
http{
… …
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name localhost;
limit_req zone=one burst=5;
#平均每秒不超过1个请求,并且突发不超过5个请求。
}
}

limit_req_zone语法格式如下:
limit_req_zone key zone=name:size rate=rate;
上面案例中是将客户端IP信息存储名称为one的共享内存,内存空间为10M并且该区域的平均请求处理速率不能超过每秒1个请求。
客户端IP地址作为关键字。需要注意的是,而不是$remote_addr,该 $binary_remote_addr变量在这里使用。$binary_remote_addr对于IPv4地址,变量的大小始终为4个字节,对于IPv6地址则为16个字节。存储状态在32位平台上始终占用64个字节,在64位平台上占用128个字节。1M可以存储8千个IP信息,10M可以存储8万个主机连接的状态,容量可以根据需要任意调整。

如果区域存储耗尽,最近最少使用的状态将被删除。即使在此之后无法创建新状态,该请求也会因错误而终止。
速率以每秒请求数(r / s)指定。如果需要每秒小于一个请求的速率,则按每分钟请求(r / m)指定。例如,每秒半请求是30r / m。

2 )重启利用ab测试

[[email protected] ~]# ab -c 100 -n 100 http://192.168.4.13/ |grep -2 "Complete requests:"

Concurrency Level:      100
Time taken for tests:   3.002 seconds
Complete requests:      100
Failed requests:        94
(Connect: 0, Receive: 0, Length: 94, Exceptions: 0)

4.拒绝非法的请求

网站使用的是HTTP协议,该协议中定义了很多方法,可以让用户连接服务器,获得需要的资源。但实际应用中一般仅需要get和post。

请求方法 功能描述
GET 请求指定的页面信息,并返回实体主体
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求
DELETE 请求服务器删除指定的页面
PUT 向服务器特定位置上传资料

1 )未修改服务器配置前,客户端使用不同请求方法测试

[[email protected] ~]# curl -i -X GET http://192.168.4.13 //正常
[[email protected] ~]# curl -i -X HEAD http://192.168.4.13 //正常

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 02 Jun 2018 05:30:03 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Thu, 31 May 2018 09:49:05 GMT
Connection: keep-alive
ETag: "5b0fc511-264"
Accept-Ranges: bytes

curl命令选项说明:
-i选项:访问服务器页面时,显示HTTP的头部信息
-X选项:指定请求服务器的方法

2 )通过如下设置可以让Nginx拒绝非法的请求

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf

http{
server {
listen 80;
if ($request_method !~ ^(GET|POST)$ ) {
return 444;
}    
}
}

3 )修改服务器配置后,客户端使用不同请求方法测试:

[[email protected] ~]# curl -i -X GET http://192.168.4.5 //正常
[[email protected] ~]# curl -i -X HEAD http://192.168.4.5 //报错

curl: (52) Empty reply from server

5.防止buffer溢出

当客户端连接服务器时,服务器会启用各种缓存,用来存放连接的状态信息。
如果×××者发送大量的连接请求,而服务器不对缓存做限制的话,内存数据就有可能溢出(空间不足)。修改Nginx配置文件,调整各种buffer参数,可以有效降低溢出风险。

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf

http{
client_body_buffer_size 8k;
client_max_body_size 2m;
client_body_in_file_only clean;
client_body_in_single_buffer on;
client_header_buffer_size 1m;
large_client_header_buffers 4 8k;
… …
}

// client_body_buffer_size 8k;此指令设置用于请求主体的缓冲区大小。 如果主体超过缓冲区大小,则完整主体或其一部分将写入临时文件。 如果NGINX配置为使用文件而不是内存缓冲区,则该指令会被忽略。 默认情况下,该指令为32位系统设置一个8k缓冲区,为64位系统设置一个16k缓冲区。 该指令在NGINX配置的http,server和location区块使用。

// client_max_body_size 2m;此指令设置NGINX能处理的最大请求主体大小。 如果请求大于指定的大小,则NGINX发回HTTP 413(Request Entity too large)错误。 如果服务器处理大文件上传,则该指令非常重要。默认情况下,该指令值为1m。

// client_body_in_file_only clean;此指令禁用NGINX缓冲区并将请求体存储在临时文件中。 文件包含纯文本数据。 该指令在NGINX配置的http,server和location区块使用。 可选值有:
off:该值将禁用文件写入
clean:请求body将被写入文件。 该文件将在处理请求后删除。
on: 请求正文将被写入文件。 处理请求后,将不会删除该文件。
默认情况下,指令值为关闭。

// client_body_in_single_buffer on;该指令设置NGINX将完整的请求主体存储在单个缓冲区中。 默认情况下,指令值为off。 如果启用,它将优化读取$request_body变量时涉及的I/O操作。

//client_header_buffer_size 1m;此指令与client_body_buffer_size类似。 它为请求头分配一个缓冲区。 如果请求头大小大于指定的缓冲区,则使用large_client_header_buffers指令分配更大的缓冲区。

//large_client_header_buffers 4 8k;此指令规定了用于读取大型客户端请求头的缓冲区的最大数量和大小。 这些缓冲区仅在缺省缓冲区不足时按需分配。 当处理请求或连接转换到保持活动状态时,释放缓冲区。

6.对页面进行压缩处理

[[email protected] ~]# cat /usr/local/nginx/conf/nginx.conf

http {
.. ..
gzip on;                                     //开启压缩
gzip_min_length 1000;                //小于1000KB文件不压缩
gzip_comp_level 4;                    //压缩比率
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
//对特定文件压缩,类型参考/usr/local/nginx/conf/mime.types
.. ..
}

?

7.开启Nginx监控页面(with-http_stub_status_module)

1)修改Nginx配置文件,定义状态页面

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf

… …
location /status {
stub_status on;
allow   127.0.0.1;                     #允许的ip       
deny all;                              #拒绝的IP  
}

2)优化后,查看状态页面信息

[[email protected] ~]# curl http://127.0.0.1/status

Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106

第一行
当前的活跃连接数:291
第二行
服务器已接受的连接数:16630948(accepted connection )
服务器已处理的连接数:16630948(handled connection )
服务器已处理的请求:31070465(可以算出,平均每个连接有 1.8 个请求)(handled connection )
第三行
Reading – Nginx 读取的请求头次数为 6;
Writting – Nginx 读取请求体、处理请求并发送响应给客户端的次数为 179;
Waiting – 当前活动的长连接数:106。
Server accepts handled requests: Nginx总共处理了16630948个连接,成功创建16630948次握手(证明中间没有失败的),总共处理了31070465个请求.
?
Waiting: 开启keep-alive的情况下,这个值等于 active – (reading + writing),意思就是Nginx已经处理完成,正在等候下一次请求指令的驻留连接.
?
所以,在访问效率高,请求很快被处理完毕的情况下,Waiting数比较多是正常的.如果reading +writing数较多,则说明并发访问量非常大,正在处理过程中.

8.自定义404页面

[[email protected] nginx]# vim /usr/local/nginx/conf/nginx.conf

.. ..
server {          
error_page  404              /404.html;
}
.. ..

以上是关于Nginx安装配置及调优的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 安装及调优

MYSQL MM HA安装配置及调优

性能测试常见瓶颈分析及调优方法

PostgreSQL on Azure.cn : 性能测试及调优

深入浅出Nacos原理及调优「原理分析专题」配置中心加载原理和配置实时更新原理分析

ElasticSearch 分布式安装及调优