设为首页 收藏本站
查看: 1423|回复: 0

[经验分享] Nginx安装配置及调优

[复制链接]

尚未签到

发表于 2018-11-15 08:41:31 | 显示全部楼层 |阅读模式
Nginx安装配置及调优
   

一、安装Nginx
   

1.安装环境

  [root@proxy ~]# yum –y install gcc pcre-devel openssl-devel


2.创建一个用户启动nginx

  [root@proxy ~]# useradd –s /sbin/nologin nginx


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

  [root@proxy 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.编译并安装

  [root@proxy nginx-1.12.2]# make && make install


5.放入PATH变量方便使用

  [root@proxy ~]# ln -s /usr/local/nginx/sbin/nginx /sbin/

   

二、升级或者更改Nginx模块
   

1.编译新的Nginx

  [root@proxy nginx-1.12.2]# ./configure
  --prefix=/usr/local/nginx
  --user=nginx
  --group=nginx
  --with-http_ssl_module
  [root@proxy nginx-1.12.2]# make


2.拷贝新版本

  [root@proxy nginx-1.12.2]# cp objs/nginx  /usr/local/nginx/sbin/


3.升级后测试

  [root@proxy 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.查看版本

  [root@proxy ~]# /usr/local/nginx/sbin/nginx -v

   

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

1.编写nginx.service文件

  [root@proxy 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>  
ExecStop=/usr/local/nginx/sbin/nginx -s stop
  
PrivateTmp=true                                         #给服务分配独立的临时空间
  

[Install]  
WantedBy=multi-user.target                            #默认
  


2.管理命令

  [root@proxy ~]# systemctl   start / stop / restart / enable nginx


四、配置文件
   

1.设置页面密码登录
  1 ) 修改配置文件

  [root@proxy ~]# 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及密码

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

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

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

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

  [root@proxy ~]# cat /usr/local/nginx/pass

  3 )重启验证

  [root@nginx nginx-1.12.2]# firefox 127.0.0.1

DSC0000.jpg

   

2.配置SSL虚拟主机
   
  1)生成私钥与证书

  [root@proxy ~]# cd /usr/local/nginx/conf
  //生成私钥
  [root@proxy ~]# openssl genrsa > cert.key
  //生成证书
  [root@proxy ~]# 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配置文件(最后),设置加密网站的虚拟主机

  [root@proxy ~]# 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)设置域名解析并访问测试

  [root@proxy ~]# echo -e "192.168.4.13\twww.cc.com" > /etc/hosts
  [root@proxy ~]# firefox https://www.cc.com

DSC0001.jpg

  (成功)
   

3.配置没网页也能打开页面
  1)修改配置文件

  [root@proxy ~]# 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 ) 创建测试的文件目录

  [root@nginx nginx]# mkdir /usr/local/nginx/test
  [root@nginx nginx]# touch /usr/local/nginx/test/1.txt

  3 )重启服务验证
DSC0002.jpg

   

4.地址重写
  1 )访问a.html重定向到b.html

  [root@proxy ~]# 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

  [root@proxy ~]# 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和火狐访问相同链接返回的页面不同

  [root@proxy ~]# 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服务器

  [root@proxy ~]# 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模块)

  [root@proxy ~]# 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 )修改配置文件

  [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
  

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

  2)测试页面(修改前)

  [root@nginx 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(修改源码包安装文件)

  [root@svr5 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配置文件,增加并发量

  [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
  

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

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

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

\*               soft    nofile            100000  
\*               hard    nofile            100000
  

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


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

  [root@svr5 ~]# 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测试

  [root@proxy ~]# 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 )未修改服务器配置前,客户端使用不同请求方法测试

  [root@client ~]# curl -i -X GET  http://192.168.4.13         //正常
  [root@client ~]# 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拒绝非法的请求

  [root@svr5 ~]# vim /usr/local/nginx/conf/nginx.conf
  

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

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

  [root@client ~]# curl -i -X GET  http://192.168.4.5            //正常
  [root@client ~]# curl -i -X HEAD http://192.168.4.5            //报错
  

curl: (52) Empty reply from server  


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

  [root@svr7 ~]# 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.对页面进行压缩处理
  [root@proxy ~]# 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配置文件,定义状态页面

  [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
  

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

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

  [root@proxy ~]# 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页面

  [root@nginx nginx]# vim  /usr/local/nginx/conf/nginx.conf
  

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


9.expires作用和优点
  expires可以降低网站的带宽,节约成本,加快用户访问网站的速度,提升了用户访问体验,服务器访问量降低,服务器压力就减轻了,服务器的成本也会降低,甚至可以节约人力成本,几乎对于所有web服务来说,这是非常重要的功能之一,apache服务也有此功能
  

location ~ ^/(images|javascript|js|css|flash|media|static)/ {  expires 360d;
  
}
  

  当网站被缓存的页面或数据更新了,此时用户端看到的可能还是旧的已经缓存的内容,这样就会影响用户体验,那么如何解决这个问题呢?
  第一:对于经常需要的变动图片等文件,可以缩短对象缓存时间,例如,百度、谷歌等网站的首页图片经常会换成一些节日的图,这里可以将缓存期修改为1天
  第二:当网站改版或更新内容时,可以在服务器将缓存的对象改名(网站代码程序)
  对于网站的图片、附件,一般不会被用户直接修改,用户层面上的修改图片,实际上是重新传到服务器,虽然内容一样但是一个新的图片名了
  网站改版升级会修改JS、CSS元素,若改版的时候对这些元素改了名,会使得前端的CDN以及用户端需要重新缓存内容



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-635209-1-1.html 上篇帖子: nginx编译安装时的参数 下篇帖子: nginx A/B 灰色发布
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表