nginx初步

一、知识整理

1、查看进程使用的cpuni查看nice

[root@localhost html]# ps axo pid,comm,psr,ni
 43769 nginx             0  21  -2
 43770 nginx             3  21  -2
 43771 nginx             2  21  -2
 43775 ps                3  19   0

2C10K问题:并发达到10k

httpdprefork模型默认是256个,其采用select上限是1024个;

3OpenResty

OpenResty是一个基于 Nginx Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

4 根据等待模式不同,IO动作可分为五种模式:

blocking I/O:阻塞式I/O:两步都阻塞

nonblocking I/O:非阻塞式I/O:忙等,阻塞在第二步

I/O multiplexing (select and poll)I/O复用:阻塞在复用IO

signal driven I/O (SIGIO):信号驱动式I/O:回调,阻塞第二阶段,解放第一阶段,可以接多个请求

asynchronous I/O (AIO_):异步I/O:解放两个阶段

5nginx的源码包编译安装,首先安装需要的环境和包:

[root@localhost nginx-1.10.0]# yum install openssl-devel  zlib-devel  pcre-devel  proxy-devel -y
[root@localhost nginx-1.10.0]# useradd -r nginx
[root@localhost nginx-1.10.0]# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio

6nginx主进程主要完成如下工作:

    读取并验证配置信息;

    创建、绑定及关闭套接字;

    启动、终止及维护worker进程的个数;

    无须终止服务而重新配置工作特性;

    控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;

    重新打开日志文件;

    编译嵌入式perl脚本;

    worker进程主要完成的任务包括:

    接收、传入并处理来自客户端的连接;

    提供反向代理及过滤功能;

    nginx任何能完成的其它任务;

    cache loader进程主要完成的任务包括:

    检查缓存存储汇总的缓存对象;

    使用缓存元数据建立内存数据库;

    cache manager进程的主要任务:

    缓存的失效及过期检验;

 

二、命令详解

1、正常运行必备的配置:

Syntaxuser user [group]

Defaultuser nobody nobody

Contextmain

定义运行work进程时的用户和组,默认是nobody

pid /PATH/TO/PID_FILE

指定存储nginx主进程进程号码的文件路径。

include file | mask

指明包含进来的其他配置文件片段;

load_module_file

装载一个动态模块(1.9.11版本之后才有)

2、性能优化相关的配置:

worker_process number | auto

worker进程的数量;通常应该为当前主机的cpu物理核心数或减一,auto为与核心数相同

worker_cpu_affinity cpumask …;

worker_cpu_affinity auto [cpumask];(cpu掩码) auto是指随机使用核心,但不高效;

如:00000001 00000010 是指第0号和第1

worker_priority number

指定worker进程的nice-20~19,此处是-20~20)值,模式都是0,。设定worker进程优先级,优先被调度到cpu

worker_rlimit_nofile  (number of file)

worker进程能够打开的文件(每个连接至少一个套接字文件)数量上限。

3、事件驱动相关的配置;

worker_connections number;

每个worker进程所能够打开的最大并发连接数量;

use METHOD

指明并发连接请求的处理方法;默认是epoll

accept_mutex on|off

处理新的连接请求的方法;on时由个worker轮流处理新请求,off以为这每个新请求的到达都会通知所有的worker进程;

mutex互斥锁,默认是off,建议设置为on

4、定义虚拟主机的配置:

listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]

 backlog=后援队列长度 rcvbuf:接受缓冲大小; sndbuf:发送缓冲大小

server_name name…

指明虚拟主机的主机名称;后可跟多个由空白字符分隔的字符串;

支持*通配任意长度的任意字符;server_name *.magedu.com

支持~起始的字符做正则表达模块匹配;server_name ~^www\d+\.amgedu\.com$

其中\d 表示0-9

匹配顺序机制:

首先是字符串精确匹配;

左侧*通配符通配;

右侧*通配符;

正则表达式匹配顺序最靠后。

tcp_nodelay on|off

对于GUI程序,如网络游戏程序(服务器需要实时跟踪客户端鼠标的移动),关闭TCP_NODELAY通常是正确的。

sendfile on|off:

sendfile系统调用是一种文件传输的系统调用kernel系统调用关系不大。nginx支持了sendfile之后,避免了内核层与用户层的上下文切换工作,大大减少了系统性能的开销;sendfile是个比 read write 更高性能的系统接口, 不过需要注意的是,sendfile 是将 in_fd 的内容发送到 out_fd 。而 in_fd 不能是 socket , 也就是只能文件句柄。 所以当 Nginx 是一个静态文件服务器的时候,开启 SENDFILE 配置项能大大提高 Nginx 的性能。 但是当 Nginx 是作为一个反向代理来使用的时候,SENDFILE 则没什么用了,因为 Nginx 是反向代理的时候。 in_fd 就不是文件句柄而是 socket,此时就不符合 sendfile 函数的参数要求了。

root和alias:

location /PATH/ 在之中定义root后,其路径是root定义的path/下的/PATH;定义了alias之后,其路径与别名是相对应的;(一个对应左侧,一个对应右侧) 在一个server中,location可以存在多个,用户实现从uri到文件系统的路径映射;nginx会根据用户请求的RUI来检查定义的所有location并找出一个最佳匹配,而后应用其配置。

5、客户端相关定义:

keepalive_timeout timeout [header_timeout];

设置保持连接的超时时长,0为禁止,默认75s

keepalive_requests number;

默认为100;在一次长连接所允许的数量;

keepalive_disable none | browser….;

设定对哪种浏览器关闭长连接;

send_timeout time

向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长;

client_body_buffer_size

默认是 16K,超出部分将被暂存到磁盘上的由下一条指定的path的指定的位置;

client_body_temp_path path [level1 [level2 [level3]]];

设定用户存储客户端请求报文的body部分临时存储路径及子目录结构和数量;

level是16进制的数字:

1 2 表示16个一级子目录下有256两个子目录,如下:

client_body_buffer_size 20K;

client_body_temp_path /tmp/nginx 1 2 2;

limit_rate rate

限制响应给客户端的传输速率;单位是bytes/second,0表示无限制;

limit_except method…

限制指定主机使用此类请求方法;allow,deny;

6、文件操作优化的配置:

alo on|off

默认是off,建议开启;

directio size|off

在服务器上启用,直接io机制,此处指文件大小大于指定大小时使用,将数据直接存入磁盘;默认是4M

open_file_cache max=N [inactive=time](非活动缓存时间,此处指定的时长内未被命中的或命中次数少于min_users指令所指定的次数的缓存项即为非活动项;过时清除)

N为缓存上线,达到上限后会使用LRU算法实现缓存管理;

打开文件缓存功能;存储文件描述符、大小、最近一次修改时间的元数据,缓存目录的结构,没有权限访问的文件的信息也会缓存下来。

open_file_cache_valid time

验证缓存有效期的检查时间;默认60s

open_file_cache_min_users number;

inactive参数指定的时长内,至少应被命中多少次方可被归类为活动项;

open_file_cache_errors on|off

是否缓存查找时发生错误的文件的相关信息;

7、基于basic机制的用户的控制:

auth_basic STRING|off

auth_basic_user_file file

8、location相关配置:

location [ = | ~ | ~* | ^~ ] uri {…}

location URI {};

对当前路径及子路径下的所有对象都生效;

location = URI;完全精确匹配,如若写为location /

则只会匹配www.magedu.com/

只对当前路径生效,不包括子路径;

location ~ URI {}

location ~* URI {}

模式匹配,此处的URI可使用正则表达式,~区分字符大小写;~*不区分大小写;

location ^~ URI {}

对左半部分做匹配检查,不区分大小写;

优先级:=最高,^~其次,~|~*相同,任何符号都没有的最末;不带符号代表以此起始的所有URL(文件,非路径);同样没有符号,以路径最长的优先;

9ngx_http_rewrite_module模块:

将用户请求的URI基于regex所描述的模式进行检查,而后完成替换;

rewrite REGEX REPLACEMENT [FLAG]

将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新URI

注意:在同一级别配置块中存在多个rewrite规则,那么会自上而下逐个检查;并逐个替换,有可能形成死循环;[flag]所表示的标志位用于控制此循环机制;如果replacement是以http://或者https://开头,则替换结果会直接以重定向返回给客户端;

[flag]

last:默认;重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;

break:本次重写完成后,跳出循环,可用于防止死循环。以上两次都是nginx内部自动跳转;客户端只需要请求一次;

redirect:返回临时重定向的30x标识码,而使浏览器重新发送请求;不能写绝对路径即以httphttps开头。此flag使用户的客户端浏览器重新发出请求,而不是在nginx内部自动跳转;

permanent:永久重定向;

三、课后练习

练习:实现lnmp,提供多个虚拟主机;

(1) http, 提供wordpress

(2) https, 提供pma

步骤一:首先配置LNMP环境:

安装所需要的开发环境和mysql-serverphpphp-fpmphp-mysql

安装编译nginx所需要的环境并编译安装nginx

[root@localhost nginx-1.10.0]# yum install openssl-devel  zlib-devel  pcre-devel  proxy-devel -y
[root@localhost nginx-1.10.0]# useradd -r nginx
[root@localhost nginx-1.10.0]# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio

配置nginx的环境变量等;

步骤二:更改php-fpm的配置文件:

[root@localhost ~]# vim /etc/php-fpm.d/www.conf

打开pingsessionpm_status功能,并将启动的属组属主更改为nginx

ping.path = /ping

php_value[session.save_path] = /var/lib/php/session

pm.status_path = /pm_status

user = nginx

group = nginx

配置mysql,更改root用户密码;此处因为安装在同一主机上,监听的IP都使用的127.0.0.1

开启mysql服务和php-fpm服务。

步骤三:配置虚拟主机1

server {

    listen 10.1.49.11:80;

    server_name www1.magedu.com;

    root /vhost/www1/;

    index index.php index.html;

    location ~* \.php$ {

        root /vhost/www1;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME /vhost/www1/$fastcgi_script_name;

        fastcgi_pass 127.0.0.1:9000;

        include fastcgi_params;

    }

    location ~* ^/(pm_status|ping)$ {

        include     fastcgi_params;

        fastcgi_pass 127.0.0.1:9000;

        fastcgi_param SCRIPT_FILENAME /vhost/www1/$fastcgi_script_name

    }

}

使用测试页测试:

[root@localhost ~]# cat /vhost/www1/index.php.bak 
<h1>Test Html</h1>
<?php
$conn=mysql_connect('localhost','root','magedu');
if ($conn)
echo "success";
else
echo "failure";
?>
<?php
phpinfo();
?>

blob.png

步骤四:安装WordPress

使用mysql授权用户:

MariaDB [(none)]> CREATE DATABASE wordpress ;
Query OK, 1 row affected (0.01 sec)
MariaDB [(none)]> USE wordpress
Database changed
MariaDB [wordpress]> GRANT ALL ON wordpress.* TO 'word'@'127.0.0.1' IDENTIFIED BY 'magedu';
Query OK, 0 rows affected (0.01 sec)
MariaDB [wordpress]> GRANT ALL ON wordpress.* TO 'word'@'localhost' IDENTIFIED BY 'magedu';
Query OK, 0 rows affected (0.00 sec)
MariaDB [wordpress]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

WordPress其父目录更改为可写:

[root@localhost vhost]# chown root:nginx www1 
[root@localhost vhost]# chmod g+w www1
[root@localhost vhost]# ll
总用量 4
drwxrwxr-x. 5 root nginx 4096 10月 15 06:50 www1
drwxr-xr-x. 2 root root    22 10月 15 06:10 www2

启动安装步骤:

blob.png

blob.png

blob.png

步骤五:配置虚拟主机2

server {

    root /vhost/www2/;

    server_name www2.magedu.com;

    listen 443 ssl;

    index index.html index.htm index.php;

    ssl on;

    ssl_certificate /etc/nginx/ssl/nginx.crt;

    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    ssl_session_cache shared:sslcache:20m;

    location ~* \.php$ {

        root /vhost/www2/;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME /vhost/www2/$fastcgi_script_name;

        fastcgi_pass 127.0.0.1:9000;

        include fastcgi_params;

    }

}

步骤六:生成证书:

[root@localhost ssl]# (umask 077;openssl genrsa -out nginx.key 2048)
[root@localhost ssl]# openssl req -new -key nginx.key -out nginx.csr -days 365
[root@localhost ssl]# openssl ca -in nginx.csr  -out nginx.crt -days 365

访问验证:

blob.png

步骤七:安装pma

[root@localhost phpMyAdmin-4.0.5-all-languages]# cp ./* -rf  /vhost/www2/
[root@localhost www2]# chown root:nginx ./* -R
[root@localhost www2]# cp config.sample.inc.php config.inc.php 
[root@localhost www2]# vim config.inc.php

添加随机数,安装:

报错:安装mbstringphp-gd包:

blob.png

[root@localhost Packages]# yum install php-mbstring  php-gd

重载服务,刷新访问:

[root@localhost Packages]# systemctl reload php-fpm

blob.png

blob.png

添加mcrypt扩展,重载访问:

[root@localhost Packages]# yum install php-mcrypt

blob.png

原创文章,作者:SilencePavilion,如若转载,请注明出处:http://www.178linux.com/56381

(0)
上一篇 2016-10-31 09:50
下一篇 2016-10-31 10:56

相关推荐

  • 逻辑卷的创建与移除

    一、弹性控制磁盘大小的lvm:     假如有这样一个场景,在初始安装linux系统时给 /home分区设置了一定大小,但是过了一段时间后,你发现初始分配的大小远不能满足公司的扩大,员工增加,需要分配的账号的磁盘空间也变大,这时你应该怎么办?是挂载一块更大的硬盘,将原来的小硬盘拆除掉吗?其实在linux中有lvm可动态增大文件系…

    Linux干货 2016-08-30
  • LVS产生背景、原理及LVS-DR应用实例(一)

    一、什么是lvs? 它产生的背景,使用场景是什么?      LVS(Linux Virtual Server) 可以理解为一个虚拟服务器系统。       Internet的飞速发展,网络带宽的增长,Web服务中越来越多地使用CGI、动态主页等CPU密集型应用,这对服务器的性能…

    Linux干货 2016-10-29
  • 周期性计划任务crond讲解

    crond是Linux或者unix系统的作业调度程序。运用它,在设定的时间段周期性执行某个命令或脚本。下文的例子均在centos 7.3上测试。一、crond组件 如果centos7.3最小化安装,不一定存在crond服务,需要手动安装,安装之后手动启动并设置以后自行开机启动。 主要有cronie、cronie-anacron、crontabs三个程序包。 …

    Linux干货 2017-03-27
  • lamp的编译安装

    基于http的php模块模式 一、需要准备的软件:     apr-1.5.0.tar    apr-util-1.5.3.tar    httpd-2.4.9.tar        mysql-5.5.33-…

    Linux干货 2016-06-22
  • N25-第九周

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash #统计shell及非shell个数 #author:dodo declare -i loginnum=0 declare -i nologinnum=0 while…

    Linux干货 2017-05-27
  • linux基础学习-第九天(shell基础)

    2016-08-10 授课内容: shell脚本基础: 变量 运算 bash测试(数字测试、字符测试、文件测试、组合测试) read命令 变量作用: 1、数据存储格式 2、参与的运算 3、表示的数据范围 变量类型: 1、本地变量 2、环境(全局)变量 3、特殊变量     驼峰命名变量:每个单词一个字母大写 本地变量:…

    Linux干货 2016-08-11