一、知识整理
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(); ?>
步骤四:安装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
启动安装步骤:
步骤五:配置虚拟主机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
访问验证:
步骤七:安装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包:
[root@localhost Packages]# yum install php-mbstring php-gd
重载服务,刷新访问:
[root@localhost Packages]# systemctl reload php-fpm
添加mcrypt扩展,重载访问:
[root@localhost Packages]# yum install php-mcrypt
原创文章,作者:SilencePavilion,如若转载,请注明出处:http://www.178linux.com/56381