Nginx


  • 安装
  • AB复制

介绍

中文版文档: http://tengine.taobao.org/nginx_docs/cn/docs/     tengine
nginx.org
C10K

Nginx 的历史 
    Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的.Igor Sysoev在建立的项目时,使用基于BSD许可.自Nginx 发布以来,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名.在俄罗斯许多大网站都已经使用它, 且一直表现不凡.俄罗斯大约有20%左右的虚拟主机是由nignx服务或代理的.Google在线安全博客中统计Nginx服务或代理了大约所有Internet虚拟主机的4%.而Netcraft的统计显示,Nginx服务的主机在过去的一年里以四倍的速度增长并且在这几年里,它的排名还在不断上升

为什么要用Nginx
    Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 .它支持内核EPoll模型,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数.Nginx具有很高的稳定性,其它HTTP服务器当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应只能重启服务器.例如当前Apache一旦上到200个以上进程,web响应速度就明显非常缓慢了.而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低.Nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对Nginx来说基本上是毫无用处的.就稳定性而言,nginx比lighttpd更胜一筹.Nginx支持热部署,它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动.你还能够在不间断服务的情况下,对软件版本进行进行升级.Nginx采用master-slave模型,能够充分利用SMP的优势,且能够减少工作进程在磁盘I/O的阻塞延迟.
    Nginx代码质量非常高,代码很规范,手法成熟, 模块扩展也很容易.
    Nginx采用了一些os提供的最新特性如对sendfile (Linux2.2+),acceptfilter(FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持,从而大大提高了性能.当然,nginx还很年轻,多多少少存在一些问题,比如:Nginx是俄罗斯人创建,目前文档方面还不是很完善.因为文档大多是俄语,所以文档方面这也是个障碍.尽管Nignx的模块比较多,但它们还不够完善.对脚本的支持力度不够.
    

获取Nginx
    Nginx的官方网站: http://nginx.org/en/download.html
Nginx官网提供了三个类型的版本
    Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版
    Stable version:最新稳定版,生产环境上建议使用的版本
    Legacy versions:老版本的稳定版

安装

Nginx安装:
1. 停止原有web服务器:
2. 添加普通用户账号来运行nginx:
    # useradd -M -s /sbin/nologin nginx
3.	解压并安装Nginx:
	# wget https://nginx.org/download/nginx-1.22.0.tar.gz
    # tar xf nginx-1.22.0.tar.gz
    # cd nginx-1.22.0
    # ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module  --with-http_ssl_module   --sbin-path=/usr/sbin/
    
若预编译出现报错,一般都是缺少一些软件包
        yum install gcc pcre-devel openssl-devel -y
   
   # make && make install
 ----------------------------------------------------------------------------------
    --prefix=/usr/local/nginx                 #指定安装路径
    --with-http_stub_status_module     #启用service status页,默认不启用
    --with-http_ssl_module                    #启用ssl模块,以支持https请求
    --sbin-path=/usr/sbin/                     #指定二进制命令的路径
       
     

    
4.	启动:
		# nginx 
--------------------------------------------------------
    nginx命令常用选项:
        -v      查看版本号
        -V      查看版本号及编译选项
        -s      给主进程发送信号.可接 stop | quit | reopen | reload    
        -t      测试配置是否正确
        -c      指定配置文件,默认为 conf/nginx.conf
5.	查看启动状态:
  # netstat -tanp|grep 80
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      5535/nginx 

6.	测试主页是否可以访问
    

配置文件

nginx主配置文件主要有以下几大块
    1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
    2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。epoll
    3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
    4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
    5、location块:配置请求的路由,以及各种页面的处理情况。

[root@clone1 nginx]# vim /usr/local/nginx/conf/nginx.conf
    #user  nobody;                 #nginx用户及组,如果用户和组名一样可只写一个    
    worker_processes  1;       #定义了nginx对外提供web服务时的worker进程数。
                       #最优值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘 数量及负载模式。
          #不能确定的时候,将其设置为可用的CPU核心数将是一个好的开始(设置为“auto”将尝试自动检测它)
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;   
    #pid        logs/nginx.pid;             
    events {
        worker_connections  1024;       #每个进程的最大连接数,根据需要调整大小
    }
    http {
        include       mime.types;             #文件扩展名与文件类型映射表
        default_type  application/octet-stream;
        server_tokens off;                       #隐藏软件版本号

        #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;                                                                       #定义日志文件
        sendfile        on;                          #开启高效文件传输模式
        #tcp_nopush     on;
    #keepalive_timeout  0;
        keepalive_timeout  65;              #连接超时时间
        #gzip  on;
        server {
            listen       80;
            server_name  localhost;
            #charset koi8-r;
            #access_log  logs/host.access.log  main;
            location / {
                root   html;
                index  index.html index.htm;
          }
            #error_page  404              /404.html;
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #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;
            #}
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
        #    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;
        #    }
        #}
    }


自定义日志

自己定义日志:在日志部分写入
    log_format cust '$remote_addr : $time_local : $http_user_agent';
    access_log logs/access.log cust;          #cust:自定义的日志名称
测试自定义日志: # curl 192.168.1.254
#cat access.log
访问的Ip:访问的时间:访问的客户端的类型


$remote_addr		              记录客户端的ip
$remote_user		              记录远程客户端的名字
$time_local		                  记录访问时间
$request		                  记录请求的URL
$status			                  记录请求状态
$body_bytes_sent	              记录发送给客户端的文件的内容的大小
$http_referer		              记录从哪个页面链接访问过来的
$http_user_agent	              记录客户端浏览器的信息
$http_x_forwarded_for	          记录客户端的ip

更多内嵌变量详见:
 http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html#variables

访问控制/用户认证

访问控制:
有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不希望公开,我们希望的是某些特定的客户端可以访问.
那么我们可以在访问时要求进行身份认证,就如给你自己的家门加一把锁,以拒绝那些不速之客.
我们在服务课程中学习过apache的访问控制,对于Nginx来说同样可以实现,并且整个过程和Apache 非常的相似.
用户认证:
    location / {
                root   html; 
                index  index.html index.htm;
                auth_basic "haha";           #服务器描述信息
                auth_basic_user_file  /usr/local/nginx/passwd.db;     #存放用户名和密码的文件
            }

    [root@web html]# htpasswd -c /usr/local/nginx/passwd.db user1
    New password: 
    Re-type new password: 
    Adding password for user user1

访问控制:      deny/allow顺序:从上到下
    location / {
                root   html;
                index  index.html index.htm;
                allow   192.168.10.0/24;           #单独允许192.168.10网段访问
                deny    all;
            }
            
apache:            
            order allow,deny
            allow from 192.168.10.0/24
            deny from all
 
限速:
使用limit_rate指令
Syntax:   limit_rate rate;
Default:  limit_rate 0;
Context: http, server, location, if in location

虚拟主机

1、配置子配置文件
# vim /usr/local/nginx/conf/nginx.conf
include /usr/local/nginx/conf.d/*.conf;            //在http {}   块里面添加

# mkdir /usr/local/nginx/conf.d/

虚拟主机类型
基于端口
基于域名
基于IP


案例:
1、编写基于域名的虚拟主机
当访问 www.baidu.com    ->   This is Baidu
      www.163.com      ->   This is 163
      www.qf.com	   ->   This is Qf

# vim conf.d/baidu.conf
server {
        listen  80;
        server_name     www.baidu.com;
        location / {
        root    html/baidu;
        index   index.html;
        }
}

# mkdir html/baidu

# vim html/baidu/index.html  //添加访问测试内容
This is Baidu

# nginx -s reload 

# vim /etc/hosts      //添加本地域名解析记录
10.3.148.201	www.baidu.com

2、编写基于端口的虚拟主机
当访问		10.3.148.201:81		->		This is port 81
		  10.3.148.201:82     ->      This is port 82
		  
# vim conf.d/81.conf
server {
        listen  81;
        server_name  localhost;
        location / {
        root    html/81;
        index   index.html;
        }
}

# mkdir html/81

# vim html/81/index.html  //添加访问测试内容
This is port 81

# nginx -s reload 

# netstat -tnlp    //查看81端口是否被监听

反向代理

nginx的反向代理与负载均衡*****

代理(Proxy)也称网络代理。它是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这
个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络
代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。代理通常分为正向代
理、反向代理及透明代理。

代理服务器的类型:
    1、正向代理服务器(标准代理服务器)
        目的:内网的服务器通过代理服务器,然后能够访问外网的服务器
        原理:内网用户将请求发给代理服务器,代理服务器根据用户需求,向真正的web服务器发出请求,然后获取到网页内容之后,在本地缓存然后发给用户。
        缺点:需要用户对浏览器进行设置
    2、透明代理服务器
        目的和原理与正向代理服务器一致,但一般布署在网关上,用户不需要再对浏览器进行设置
        需要结合iptables
    3、反向代理服务器(反向加速服务器)
        目的:外网客户端通过代理服务器,能够访问内网服务器的资源
        原理:外网客户端访问正常的域名或者IP,其实访问的是代理服务器,代理服务器帮助客户端请求页面,在代理服务器上缓存,然后再发送给客户端。

反向代理:
该功能由ngx_http_proxy_module模块提供
    location / {
            proxy_pass  http://www.jd.com;
    }
        
   验证:在浏览器上访问Nginx的IP地址会自动跳转jd首页

负载均衡

负载均衡:
该功能由ngx_http_upstream_module+ngx_http_proxy_module模块提供
调度算法:
轮循       静态
加权轮循    静态
least_conn: 根据其权重值,将请求发送到活跃连接数最少的那台服务器, 动态
ip_hash: 把同一客户端的请求调度到同一台真实服务器上.

1. 轮循 - 后端每台服务器的权重相同
    upstream  webs {       
        server 192.168.10.12;
        server 192.168.10.13;
    }
    server {
        ...
        location / {
            proxy_pass  http://webs;
        }
        ...
    }

2.加权轮循: 在每台服务器上加入权值,权值越高的服务器分配到的请求越多

     upstream  webs {
        server 192.168.10.12 weight=1;
        server 192.168.10.13 weight=2;
    }  
       
--------------------------------------------------------------------------------------------
[root@nginx conf]# vim /usr/local/lnmp/nginx/conf/nginx.conf
    
    upstream qfedu {
         server 192.168.10.11 weight=1 max_fails=2 fail_timeout=30s;
         server 192.168.10.12 weight=2;
         server 192.168.10.13 backup;            #backup:备份,其他服务器全部宕机后启用  
    }

-------------------------------------------------------------------------------------------
3. ip_hash: 让同一客户端在一定时间内访问到同一台服务器
   IPv4地址的前三个字节或者IPv6的整个地址,会被用来作为一个散列key。 这种方法可以确保从同一个客户端过来的请求,会被传给同一台服务器。
    upstream qfedu {
        ip_hash;
        server 172.16.0.10;
        server 172.16.5.100;
        server 172.16.16.100;
    }

客户端测试:
	同一客户端访问一直得到同一个页面.

LNMP架构 – 上线WordPress

1、安装php服务
# yum install php php-mysql php-fpm -y
# systemctl start php-fpm
# # netstat -tnlp | grep 9000
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      115012/php-fpm: master

2、编写lnmp架构的虚拟主机配置文件
# vim /usr/local/nginx/conf.d/lnmp.conf
server {
        listen  83;
        server_name     localhost;
        location / {
            root        html/wordpress;
            index       index.html index.php;
        }
        location ~ \.php$ {
            root           html/wordpress;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
}


3、下载WordPress源码包
# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
# tar xf latest-zh_CN.tar.gz            //解压出一个wordpres目录
# mv wordpress/* html/wordpress/
mv:是否覆盖"html/wordpress/index.php"? y             //因为上面写了测试页面index.php  按y确认覆盖

【注意:新版本的wordpres源码包需要php版本7.1以上,yum源自带版本是5.4.16】
解决方案:
1、更换php版本
# wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# wget --no-check-certificate  https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# rpm -Uvh epel-release-latest-7.noarch.rpm remi-release-7.rpm
【会增加很多php版本的yum源】
# rpm -qa | grep php | xargs -I {} rpm -e --nodeps {}        //卸载老版本
# yum install php73-php php73-php-mysql php73-php-fpm -y
# systemctl start php73-php-fpm

2、更换更老的wordpres源码包版本wordpress-4.5.3-zh_CN.tar.gz

3、准备数据库
# yum install mariadb-server -y
# systemctl start mariadb
# mysql -uroot
MariaDB [(none)]> create database wordpress;      //创建所需要的数据库
Query OK, 1 row affected (0.00 sec)

4、抱歉,我不能写入wp-config.php文件
# vim html/wordpress/wp-config.php    //添加页面上的内容

image-20220527165653558

版权声明:本文为boldcc原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/boldcc/p/16751342.html