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)
SilencePavilionSilencePavilion
上一篇 2016-10-31
下一篇 2016-10-31

相关推荐

  • 路由以及实验

    路由 路由(routing)是指分组从源到目的地时,决定端到路径的网络范围的进程。路由工作在OSI模型第三层——网络层的数据包转发设备。路由器通过转发数据包来实现网络互连。路由器可以支持多种协议,但绝大多数使用的是TCP/IP协议。路由器通常连接两个或者多个由IP子网或者点到点协议表示的逻辑端口,至少拥有1个物理端口。路由器根据收到数据包中的网络层地址以及路…

    Linux干货 2017-05-11
  • ☞磁盘管理{分区表备份与恢复;修复fstab记录错误;制作swap分区;磁盘配额演示;}

    磁盘管理{ 分区表备份与恢复;错误fstab修复;swap分区;磁盘配额;}

    Linux干货 2016-09-04
  • 沉舟侧畔千帆进,枯木头前万树春

    N21第五周博客作业 1、  显示/boot/grub/grub.conf中以至少一个空白字符开头的行; ~]#  grep -E "^[[:space:]]+" //boot/grub/grub.conf root (hd0,0) kernel /vmlin…

    Linux干货 2016-07-29
  • linux入门学习动手部分

    linux入门学习了几天,各种命令跟选项如果靠记忆很容易忘记,通过下面随堂实验加深记忆 实验操作部分 enable 命令使用 禁用内部命令 enable -n echo 禁用echo命令 重新启用echo命令 enable echo type 命令使用 type -a echo 列出所有echo的内部命令外部命令 type -p cd 显出cd外部命令的路径…

    Linux干货 2017-05-20
  • Linux 基础知识(二)

    一、Linux文件管理类命令的使用方法及其相关示例演示? 1、文件管理 2、文件查看 二、Bash特性详解 1、命令行展开 (1)在/tmp目录下创建:a_c,a_d,b_c,b_d 方法一:mkdir -pv {a,b}_{c,d} (2)在/tmp目录下创建mylinux目录,其结构如下:         方法一:…

    Linux干货 2016-09-26
  • 配置路由实例

    路由的分类和管理 路由:跨网络通信; 路由分类:     主机路由     网络路由     默认路由 路由管理命令: route 命令是在本地 IP 路由表中显示和修改条目网络命令; 查看:route -n 添加:route add ro…

    Linux干货 2016-09-12