nginx初步

一、知识整理

1、查看进程使用的cpu;ni查看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

2、C10K问题:并发达到10k

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

3、OpenResty

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:解放两个阶段

5、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

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

    读取并验证配置信息;

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

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

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

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

    重新打开日志文件;

    编译嵌入式perl脚本;

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

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

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

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

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

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

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

    cache manager进程的主要任务:

    缓存的失效及过期检验;

 

二、命令详解

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

Syntax:user user [group];

Default:user nobody nobody;

Context:main

定义运行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(文件,非路径);同样没有符号,以路径最长的优先;

9、ngx_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标识码,而使浏览器重新发送请求;不能写绝对路径即以http和https开头。此flag使用户的客户端浏览器重新发出请求,而不是在nginx内部自动跳转;

permanent:永久重定向;

三、课后练习

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

(1) http, 提供wordpress;

(2) https, 提供pma;

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

安装所需要的开发环境和mysql-server,php,php-fpm,php-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

打开ping、session和pm_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

添加随机数,安装:

报错:安装mbstring和php-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 09:50
下一篇 2016-10-31 10:56

相关推荐

  • bash循环、函数、数组、内置的字符串处理、变量、trap信号捕捉

    流程控制 过程式编程语言: 顺序执行 如果是命令写错了,可以继续往下执行;但当语法错误时则不会往下继续执行; 选择执行 循环执行 条件选择:if语句 单分支 if 判断条件;then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi 多分支 if 判断条件1; then 条件为真的分支代码 …

    Linux干货 2017-05-21
  • Linux计划任务

    计划任务 Linux任务计划、周期性任务执行 • 未来的某时间点执行一次任务:     at     batch:系统自行选择空闲时间去执行此处指定的任务 • 周期性运行某任务:      cron at任务 …

    Linux干货 2016-09-10
  • 用户组和用户权限的使用2

    touch /etc/nologin  echo system is maintanining >> /etc/nologin  可以控制非管理员root之外的所有普通用户不能登陆 7版本里面 cd /run/ touch /run/nologin 效果一样让普通用户不能登陆 ehho weihu > /run/nolo…

    Linux干货 2016-08-04
  • 网络21期第十周博客作业

    网络21期第十周博客作业 1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) Centos6启动流程:       POST加电自检 —> BOOT Sequence —> 加载内核启动系统  &…

    Linux干货 2016-09-15
  • Heartbeat高可用http

    Heartbeat高可用http 实验图 heartbeat高可用http 一、实验图: 二、heartbeat高可用http(Heartbeat V1 haresource) heartbeat节点ssh互信 heartbeat节点名称相互解析,uname -n heartbeat节点时间一致性 安装前准备: ssh多节点互信 [root@node4&nb…

    Linux干货 2016-07-07
  • iptables防火墙

    Linux防火墙基础 在Internet中,企业通过架设各种应用系统来为用户提供各种网络服务,例如Web网站,电子邮件系统,FTP服务器,数据库系统等等,而防火墙就是用来保护这些服务器,过滤企业不需要的访问甚至是恶意的入侵。 Linux防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙。Linux防火墙体系基于内核编码实…

    Linux干货 2017-01-10