Nginx初步优化

博文大纲:
1.Nginx简介
2.Nginx的核心特点
3.Nginx平滑升级
4.修改Nginx版本信息
5.Nginx虚拟主机配置
6.nginx配置文件location选项的作用
7.配置https访问nginx
8.开启Nginx访问认证

Nginx是什么?

1.Nginx简介

Nginx是一款轻量级的网页服务器、反向代理服务器以及电子邮件代理服务器。因它的稳定性、丰富的功能集、实例配置文件和低系统资源消耗而闻名。

Nginx已经在俄罗斯最大的门户网站上运行,同时俄罗斯有超过20%的虚拟主机平台采用Nginx作为反向代理服务器;在国内,Nginx已经运行在淘宝、新浪、网易等多家网站使用Nginx作为Web服务器或反向代理服务器。

2.Nginx的核心特点

  • (1)跨平台:Nginx可以在大多数OS编译运行,而且也有Windows版本;
  • (2)配置异常简单、非常容易上手;
  • (3)非阻塞、高并发连接;官方测试能够支撑5万的并发连接,在实际环境中可以达到2~3万并发连接数。(这得益于Nginx使用了最新的epoll模型);
  • (4)事件驱动:采用epoll模型,支持更大的并发连接;
    非阻塞通过不断检查事件的状态来判断是否进行读写操作,这样带来的开销很大,因此就有了异步非阻塞的事件处理机制。这种机制让你可以同时监控多个事件,调用他们是非阻塞的,但可以设置超时时间,在超时时间之内,如果有事件准备好了,就返回。这种机制解决了上面阻塞调用与非阻塞调用的两个问题。
    以 epoll 模型为例:当事件没有准备好时,就放入 epoll(队列)里面。如果有事件准备好了,那么就去处理;当事件没有准备好时,才在 epoll 里面等待。这样,我们就可以并发处理大量的并发请求了,当然,这里的并发请求,是指未处理完的请求。线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求之间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事件。
    多线程方式相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换, 事件处理非常的轻量级,并发数再多也不会导致无谓的资源浪费(上下文切换)。对于 apache 服务器,每个请求会独占一个工作线程,当并发数上到几千时,就同时有几千的线程在处理请求了。这对操作系统来说,是个不小的挑战:因为线程带来的内存占用非常大,线程的上下文切换带来的 cpu 开销很大,自然性能就上不去,从而导致在高并发场景下性能下降严重。
    总结:通过异步非阻塞的事件处理机制,Nginx 实现由进程循环处理多个准备好的事件,从而实现高并发和轻量级。
  • (5)Master/Worker 结构:一个 master 进程,生成一个或多个worker 进程,如图:

    Master-Worker设计模式主要包含两个主要组件Master和Work,Master维护者Worker队列,将请求下发到多个Worker并行执行,Worker主要进行实际逻辑计算,并将结果返回给Master。
    采用独立的进程,可以让互相之间不会影响,一个进程退出后,其他进程还在工作,服务不会中断,Master进程则很快重新启动新的Worker进程。当然,Worker进程的异常退出,肯定是程序中有bug了,异常退出,会导致当前Worker上的所有请求失败,不过不会影响到所有的请求,所以降低了风险;
  • (6)内存消耗小:处理高并发的请求内存消耗非常小。在3万并发连接下,开启的10个Nginx进程才消耗150M内存;
  • (7)内置的健康检查工作:如果Nginx代理的后端某台Web服务器宕机了,不会影响前端的访问;
  • (8)节省带宽:支持GZIP压缩,可以添加到浏览器本地缓存的Header头;
  • (9)稳定性高:用于反向代理,宕机的概率微乎其微;

3.Nginx平滑升级

本篇博文中所需使用的软件包都已经打包了,可以直接下载Nginx软件包

所谓Nginx平滑升级就是当前服务器正在运行Nginx服务,想将当前运行的Nginx服务的版本进行升级,且在服务不停止的前提进行升级。

实现思路:

  • 在不停止老进程的情况下,启动新进程;
  • 老进程负责处理仍然没有处理完成的请求,但不再接收处理请求;
  • 新进程接收新请求;
  • 老进程处理完所有请求,关闭所有连接后,停止;

实现步骤:

[[email protected] ~]# yum -y install pcre-devel openssl-devel               //安装nginx所需依赖
[[email protected] ~]# tar zxf nginx-1.14.0.tar.gz -C /usr/src
[[email protected] ~]# cd /usr/src/nginx-1.14.0/
[[email protected] nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make && make install
//编译安装nginx1.14版本,由于实验环境,配置项较少
[[email protected] ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin                   //创建符号链接
[[email protected] ~]# nginx                       //启动nginx服务
[[email protected] ~]# nginx -v                    //查看Nginx服务的版本信息
nginx version: nginx/1.14.0
[[email protected] ~]#  tar zxf nginx-1.2.4.tar.gz -C /usr/src
[[email protected] ~]#  cd /usr/src/nginx-1.2.4/
[[email protected] nginx-1.2.4]#  ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make
//配置、编译nginx1.2.4版本,注意不要进行安装,可以根据需要添加配置项,但是原本的配置必须存在
[[email protected] ~]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
//备份旧版本的nginx的执行程序
[[email protected] ~]# cp /usr/src/nginx-1.2.4/objs/nginx /usr/local/nginx/sbin/
//替换旧的Nginx的执行程序
[[email protected] ~]# netstat -anpt | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      4655/nginx: master
[[email protected] ~]# kill -USR2 4655       //建议针对nginx的进程号进行操作,不建议针对nginx的pid文件进行操作
//生成新的进程去接收客户端请求,执行完成后nginx安装目录下logs目录会出现一个nginx.pid.old文件,用来存放旧版的pid信息
[[email protected] ~]# nginx -s reload                 //重新加载新版的nginx配置
[[email protected] ~]# kill -HUP 4655                   //平滑的重启新版的nginx进程
[[email protected] ~]# nginx -v                         //查看nginx版本信息
nginx version: nginx/1.2.4
[[email protected] ~]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.14.0               //头部信息版本还未更改
Date: Sun, 01 Dec 2019 06:04:10 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sun, 01 Dec 2019 05:59:29 GMT
Connection: keep-alive
ETag: "5de356c1-264"
Accept-Ranges: bytes
[[email protected] ~]# kill -QUIT 4655                   ////平滑的关闭旧版的nginx进程
[[email protected] ~]# nginx -v                         //查看nginx版本信息
nginx version: nginx/1.2.4
[[email protected] sbin]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.2.4                 //注意版本信息,已经成功发生改变
Date: Sat, 30 Nov 2019 14:47:53 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sat, 30 Nov 2019 14:42:09 GMT
Connection: keep-alive
Accept-Ranges: bytes

注意:整个过程中,建议针对进程号进行平滑升级、重启、关闭等操作!

关于nginx使用kill命令常用的参数:

  • QUIT 平滑关闭
  • HUP 平滑重启,重新加载配置文件
  • USR1 重新打开日志文件
  • USR2 平滑升级可执行程序
  • WINCH 平滑关闭工作进程

4.修改Nginx版本信息

[[email protected] ~]# vim /usr/src/nginx-1.2.4/src/core//nginx.h
                     ………………          //省略部分内容
#define nginx_version      1002004
#define NGINX_VERSION      "8.8.8.8"                       //根据实际情况修改为自己想要的信息
#define NGINX_VER          "lzj/" NGINX_VERSION            //同上,注意修改完的lzj
[[email protected] ~]# vim /usr/src/nginx-1.2.4/src/http/ngx_http_header_filter_module.c
                     ………………          //省略部分内容
static char ngx_http_server_string[] = "Server: lzj" CRLF;                //与上一个文件中修改的名称一样(lzj)
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
[[email protected] ~]# vim /usr/src/nginx-1.2.4/src/http/ngx_http_special_response.c
                     ………………          //省略部分内容
                     static u_char ngx_http_error_tail[] =
"<hr><center>lzj</center>" CRLF                     //注意与上两个文件中修改的lzj要一致
"</body>" CRLF
"</html>" CRLF
;
[[email protected] ~]# cd /usr/src/nginx-1.2.4/
[[email protected] nginx-1.2.4]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make
[[email protected] ~]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
[[email protected] ~]# cp /usr/src/nginx-1.2.4/objs/nginx /usr/local/nginx/sbin/
[[email protected] ~]# nginx -s stop                //停止nginx服务
[[email protected] ~]# nginx                        //开启nginx服务
[[email protected] ~]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: lzj/8.8.8.8                              //查看版本信息
Date: Sat, 30 Nov 2019 15:06:32 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sat, 30 Nov 2019 14:42:09 GMT
Connection: keep-alive
Accept-Ranges: bytes

注意:修改nginx版本信息,就需要重启服务,所以如果想要修改则尽量在安装之前就进行修改!

5.Nginx虚拟主机配置

在nginx的配置文件中,有一个http{}的段落,在http{}中还包含了server{},其中一个server{}则代表一个虚拟主机,实现方法如下:

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
//编辑Nginx的主配置文件,实现相同IP,不同域名进行访问
             ……………………………………              //省略部分内容
    server {
        listen    80;
        server_name      www.lzj.com;
        location / {
        root /lzj;
        index index.html index.htm;
        }
        }
    server {
        listen    80;
        server_name      www.zhj.com;
        location / {
        root /zhj;
        index index.html index.htm;
        }
        }
[[email protected] ~]# mkdir /lzj                                 //自行创建各自的首页文件
[[email protected] ~]# echo "www.lzj.com" >> /lzj/index.html
[[email protected] ~]# mkdir /zhj
[[email protected] ~]# echo "www.zhj.com" >> /zhj/index.html
[[email protected] ~]# echo "192.168.1.8  www.lzj.com" >> /etc/hosts    //在本地hosts文件添加相应的域名
[[email protected] ~]# echo "192.168.1.8  www.zhj.com" >> /etc/hosts
[[email protected] ~]# nginx -t                             //检查nginx配置文件有无语法错误
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
[[email protected] ~]# nginx -s reload                    //重新加载nginx配置文件
[[email protected] ~]# curl www.lzj.com                   //验证效果
www.lzj.com
[[email protected] ~]# curl www.zhj.com
www.zhj.com

6.nginx配置文件location选项的作用

主要介绍一下nginx配置文件server{}段落中的location的详细配置

(1)“=”号的作用

“=”号表示绝对匹配,访问网页的根目录可以,但是访问后面天啊及参数就不可以了,比如:

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
//编辑Nginx主配置文件
                ………………………………        //省略部分内容
    server {
        listen       80;
        server_name  localhost;
        location = /test {                     //寻找网页根目录下的test目录中的内容
            root   test;                  //寻找的路径为/usr/lcoal/nginx/html/test/目录中的首页文件
            index  index.html index.htm;
        }
[[email protected] ~]# mkdir /usr/local/nginx/html/test
[[email protected] ~]# echo "test" >> /usr/local/nginx/html/test/index.html              //创建测试文件
[[email protected] ~]# nginx -t
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
[[email protected] ~]# nginx -s reload

客户端访问效果:

(2)alias与root的区别

root:实际访问的文件会被拼接URL的路径;
alias:实际访问的文件路径不会拼接URL的路径;

使用root路径:

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
    location ^~ /www {                             //^表示以什么开头,~表示使用正则表达式
            root   html;                          //root:实际访问的文件路径会拼接URL的路径,这里的html是相对路径
            index  index.html index.htm;          //那么访问的路径就是/usr/lcoal/nginx/html/www
        }
[[email protected] ~]# mkdir /usr/local/nginx/html/www
[[email protected] ~]# echo "www" >> /usr/local/nginx/html/www/index.html
//创建测试文件
[[email protected] ~]# nginx -s reload  //重新加载nginx的配置文件

访问效果如下:

使用alias路径:

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
    location ^~ /www {
            alias   html;                       //alias:实际访问的路径不会拼接URL的路径
            index  index.html index.htm;
        }
[[email protected] ~]# nginx -s reload  //重新加载nginx的配置文件

访问效果如下:

(3)匹配指定的后缀时,就重定向到指定的文件

实例一:

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
    ...............              //省略部分内容
        location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
        root /www;                    //当用户访问的是gif、jpg等文件时,去/www目录下寻找
        index index.html index.htm;
        }

        location / {
            root   html;
            index  index.html index.htm;
        }
[[email protected] ~]# ls /www
a.jpg
[[email protected] ~]# nginx -s reload                //重新加载配置文件

客户端访问:

实例二:

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
    ...............              //省略部分内容
        location ~* .(gif|jpg|jpeg|png|css|js|ico)$ {
        rewrite .(gif|jpg) /error.png;        //当客户端访问的是jpg等结尾的文件时,自动跳转到error.png
        }               //error.png的存在位置就是网页根目录,因为是“/error.png”

[[email protected] ~]# ls /usr/local/nginx/html/
50x.html  error.png  index.html
[[email protected] ~]# nginx -s reload

客户端访问测试:

(4)当匹配指定的请求方式,就返回特定的状态码

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
    ...............              //省略部分内容
          if ($request_method = BDQN) {
            return 666;         //当客户端访问BDQN的方式访问时,返回状态码为666
        }
[[email protected] ~]# nginx -s reload             //重新加载配置文件

访问效果如下:

curl命令常用参数:

  • -X:请求的方式;
  • -I:返回服务器响应头部报文

(5)当客户端是以域名访问的,就跳转到指定的域名

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
    ...............              //省略部分内容
          if ($host != ‘www.test.com‘) {
            rewrite ^/(.*)$ https://www.baidu.com/$1;
        }           //当客户端不是通过www.test.com 方式访问就会跳转到百度的页面
[[email protected] ~]# nginx -s reload       //重新加载配置文件

访问效果如下:

7.配置https访问nginx

我们都知道http是80端口,https是443端口,由于https更加安全,所以现在大多数web服务都是通过https方式进行访问的,接下来,就配置一下https访问nginx服务器。

由于互联网认证的CA证书需要付费购买,实验环境所以这里就自己做一个,没有经过互联网认证的CA证书。方法如下:

[[email protected] ~]# mkdir /usr/local/nginx/ca       //创建一个目录用于存放ca证书、秘钥
[[email protected] ~]# cd /usr/local/nginx/ca/
[[email protected] ca]# openssl genrsa -out ca.key 4096            //生成秘钥文件
Generating RSA private key, 4096 bit long modulus
..............................++
.....................................................................................................++
e is 65537 (0x10001)
[[email protected] ca]#  openssl req -new -x509 -days 7304 -key ca.key -out ca.crt
//通过密钥生成证书文件,以下内容随意填写
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.‘, the field will be left blank.
-----
Country Name (2 letter code) [XX]:zh
State or Province Name (full name) []:beijing
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:beijing
Organizational Unit Name (eg, section) []:beijing
Common Name (eg, your name or your server‘s hostname) []:beijing
Email Address []:beijing
[[email protected] ca]# ls           //确认目录下有这两个文件
ca.crt  ca.key
[[email protected] ca]# vim /usr/local/nginx/conf/nginx.conf
    ...............              //省略部分内容
    server {
        listen       443 ssl;             //使用ssl加密
        server_name  localhost;

        ssl                  on;           //启用ssl
        ssl_certificate      /usr/local/nginx/ca/ca.crt;      //证书存放路径
        ssl_certificate_key  /usr/local/nginx/ca/ca.key;    //秘钥存放路径

        ssl_session_timeout  5m;          //session会话超时时间  

        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }
//配置文件末尾存放,启用即可!
[[email protected] ~]# nginx -s reload           //重载nginx配置文件

访问效果:

8.开启Nginx访问认证

有些时候,我们web服务的一些页面,不方便对所有人开放,这事,可以开启该网页的访问认证,开启后,就需要使用用户名密码进行登录,才可看到相应的页面。

如果不开启认证方式的话,用户就可以直接访问网站内容,如下:

开启认证,方法如下:

[[email protected] ~]# yum -y install httpd-tools    //安装htpassword工具
[[email protected] ~]# htpasswd -c /usr/local/nginx/.passwd lzj
New password:
Re-type new password:
Adding password for user lzj
//用户认证信息存放路径是/usr/local/nginx/.passwd
//若要向.passwd中添加第二个用户,需要省略“-c”选项,否则会覆盖之前的所有用户。
[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
    ...............              //省略部分内容
        location / {
            root   html;
            index  index.html index.htm;
            auth_basic "请输入登录账号";     //添加提示语句
            auth_basic_user_file /usr/local/nginx/.passwd;    //认证信息存放路径
        }
[[email protected] ~]# nginx -s reload           //重载nginx配置文件

访问测试:

———————— 本文至此结束,感谢阅读 ————————

原文地址:https://blog.51cto.com/14157628/2455090

时间: 2024-08-08 13:13:53

Nginx初步优化的相关文章

Nginx深度优化(二)

Nginx作为现在最流行的Web应用程序,对其优化十分重要.通过Nginx初步优化.深度优化Nginx(一)已经可以对Nginx进行大量的优化来满足基本的需要,但是作为一名合格的运维工程师来说,仅仅掌握以上对Nginx进行优化的方法显然是远远不足的.所以就需要本篇博文进一步对Nginx进行优化. 博文大纲:一.安装nginx服务器二.Nginx配置优化(1)Nginx 运行工作进程个数(2)Nginx 事件处理模型 (3)开启高效传输模式(4)连接超时时间(5)fastcgi调优(6)expir

nginx基本优化

1.1   隐藏nginx header里版本号信息 1.2   更改源码隐藏软件名称及版本号 1.3   更改掉nginx默认用户及用户组(worker进程服务用户优化) 1.4   配置nginx worker进程个数 1.5   根据cpu核数进行nginx进程优化 1.6   nginx事件处理模型优化 1.7   调整nginx worker单个进程允许的客户端最大连接数 1.8   配置nginx worker进程最大打开文件数 1.9   开启高效的文件传输模式 1.10  设置连

nginx 配置优化的几个参数

nginx 配置优化的几个参数 2011-04-22 本文地址: http://blog.phpbean.com/a.cn/7/ --水平有限欢迎指正-- -- 最近在服务器上搞了一些nginx 研究了一下 总结总结Sleep nginx配置文件里面需要注意的一些参数 worker_processes 8 nginx要开启的进程数 一般等于cpu的总核数 其实一般情况下开4个或8个就可 我开2个 以了 多了没有太多用 每个nginx进程消耗的内存10兆的模样 worker_cpu_affinit

数据库5.5.32编译安装和简单的初步优化

.数据库5.5.32编译安装和简单的初步优化 1.环境: [[email protected] sbin]# cat/etc/redhat-release CentOS release 6.6 (Final) Ip:外网:10.0.0.31  内网:172.16.1.31 2.安装步奏: Useradd mysql -s /sbin/nologin -M Id mysql yum install cmake -y yum install libaio-develncurses-devel -y

nginx + SSL优化配置

nginx + SSL优化配置: 1 #http段添加如下配置项: 2 3 http { 4 5 ssl_prefer_server_ciphers on; #设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件. 6 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #协议安全设置 7 ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #加密套件 ssl_ciph

Nginx性能优化配置(三)

Nginx性能优化配置(三)  本文主要介绍Nginx的性能优化配置,文章的层次架构如图所示. 1.Nginx的工作进程优化 1.worker_processes 作用:worker进程的数量:通常应该等于小于当前主机的cpu的物理核心数:auto表示根据CPU的物理核心数自动调整工作进程数.使用lscpu或或者cat /proc/cpuinfo | grep 'processor' | wc -l 可以查看CPU的物理核心数. 配置:worker_processes auto: 配置段:mai

企业级Web Nginx 服务优化(1)

企业级Web Nginx 服务优化 总结配置文件: nginx.conf httpd.conf httpd-vhosts httpd-mpm.conf my.cnf php.ini php-fpm.conf 1.1nginx.conf 配置文件基本参数优化 1.1.1 隐藏nginx header 内版本号信息 一些特定的系统及服务漏洞一般都和热定的软件及版本号有关,我们应尽量隐藏服务器的敏感信息(软件名称及版本等信息),这样黑客无法猜到有漏洞的服务是否是对应服务的版本,从而确保web服务器最大

企业级nginx.conf优化参考模板

以下是我整理的非常实用的企业级nginx.conf优化参考模板,整个配置并不一定适合各种环境,所以需要大家按各自需求选取部分功能配置到自己的nginx配置文件中. user nginx;     #Nginx服务的默认用户 worker_processes 4;     #一般为CPU核个数 worker_cpu_affinity 001 0010 0100 1000;  #绑定不同Nginx进程到不同CPU上 worker_rlimit_nofile 6535;     #worker进程最大

高并发下 Nginx的 优化

过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apache迁移过来的,因些他们过去常常调整配置和执行魔术操作来确保服务器高效运行. 有一些坏消息要告诉你, 你不能像Apache一样优化Nginx.它没有魔术配置来减半负载或是让PHP运行速度加快一倍. 高兴的是, Nginx已经优化的非常好了. 当你决定使用Nginx并用apt-get,yum或是make命令安装的时候它就已经进行了最佳优化. (注意那些库经常过期,Wiki的安装页面上通常有