Nginx服务与LNMP部署以及管理优化

Nginx服务与LNMP部署

Nginx简介:跟Apache一样,是一款web服务器软件,也在普遍使用

Nginx的特点:并发量高,内存占用小、处理速度快、但是CPU占用大、安全性较低、模块较少

Nginx服务配置

启动命令:nginx       停止命令:killall -s QUIT nginx        重启命令:killall -s QUIT nginx 》》nginx

重新加载:killall -s HUP nginx           查看服务开启状态:ps -ef | grep "nginx" 或者netstat -anpt | grep "nginx"

配置文件详解

nginx配置文件主要分为六个区域:

1.main:全局设置        2.events:nginx工作模式     3.http:http设置

4.sever:主机设置      5.location:URL匹配       6.upstream:负载均衡服务器设置
配置文件结构分布:


main

events{。。。。。。}

http{

。。。。。。

server{

。。。。。。

location 1{。。。。。。}

location 2{。。。。。。}

}

}


全局配置:

user  nobody;     //程序用户名

worker_processes  1;      //设置nginx子进程数量,即提供服务的进程数量,该数值建议和服务cpu核数保持一致

error_log  logs/error.log;   //设置错误日志的路径

error_log  logs/error.log  notice;   //设置错误日志的路径

error_log  logs/error.log  info;   //设置错误日志的路径

pid  logs/nginx.pid;    //设置nginx进程pid文件所在路径

worker_rlimit_nofile 10000;    //设置nginx最多打开文件数限制

events配置:

worker_connections 1024;     //定义每个work_process同时开启的最大连接数

accept_mutex on;          //防止多个进程争抢资源,默认就是on

multi_accept on;         //nginx worker processer可以做到同时接收多个新到达的网络连接,默认为off

use epoll;           //设置模式,模式有如下:

select:只能在Windows下使用,这个事件模型不建议在高负载的系统使用

poll:Nginx默认首选,但不是在所有系统下都可用

kqueue:这种方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系统中是最高效的

epoll:这种方式是在Linux 2.6+内核中最高效的方式

rtsig:实时信号,可用在Linux 2.2.19的内核中,但不适用在高流量的系统中

eventport:Solaris 10最高效的方式

http配置:

MIME-Type

include mime.types;            //设置nginx能识别的网络资源媒体类型(如,文本、html、js、css、流媒体等)

default_type application/octet-stream;      //设置默认的type,如果不定义改行,默认为text/plain.

log_format

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

其中main为日志格式的名字,后面的为nginx的内部变量组成的一串字符串。

access_log logs/access.log main;    //设置日志的路径以及采用的日志格式,该参数可以在server配置块中定义

sendfile on;              //是否调用sendfile函数传输文件,默认为off

sendfile_max_chunk 128k;         //限制Nginx worker process每次调用sendfile()函数传输数据的最大值,默认值为0无限制

tcp_nopush on;         //当调用tcp_cork方法进行数据传输,默认值为on

keepalive_timeout 65 60;    //第一个值设置nginx服务器与客户端会话结束后仍旧保持连接的最长时间,单位是秒,默认为75s

第二个值针对客户端的浏览器来设置的,可以通过curl -I看到header信息中有一项Keep-Alive: timeout=60,如果

补充:不设置就没有这一项,第二个数值设置后,浏览器就会根据这个数值决定何时主动关闭连接,Nginx服务器就不操心了。但

有的浏览器并不认可该参数

send_timeout           //发送响应的超时时间

client_max_body_size 10m;             //限制Content-Length所示值的大小的

gzip on;    //是否开启gzip压缩

gzip_min_length 1k;       //设置允许压缩的页面最小字节数,默认值20

gzip_buffers 4 16k;         //设置系统获取几个单位的buffer用于存储gzip的压缩结果数据流

gzip_http_version 1.1;         //用于识别 http 协议的版本

gzip_comp_level 6;       //gzip压缩比

gzip_types mime-type ... ;          //匹配mime类型进行压缩

gzip_proxied any;                      //Nginx作为反向代理的时候启用,决定开启或者关闭后端服务器返回的结果是否压缩

以下为可用的值:

off - 关闭所有的代理结果数据的压缩

expired - 启用压缩,如果header头中包含 "Expires" 头信息

no-cache - 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息

no-store - 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息

private - 启用压缩,如果header头中包含 "Cache-Control:private" 头信息

no_last_modified - 启用压缩,如果header头中不包含 "Last-Modified" 头信息

no_etag - 启用压缩 ,如果header头中不包含 "ETag" 头信息

auth - 启用压缩 , 如果header头中包含 "Authorization" 头信息

any - 无条件启用压缩

gzip_vary on;     //可以让前端的缓存服务器缓存经过gzip压缩的页面

为了方便我们自己写个脚本,然后可以用service命令来管理nginx

脚本如下:

#!/bin/bash
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
PROG_FPM="/usr/local/sbin/php-fpm"
PID_FPM="/usr/local/php5/var/run/php-fpm.pid"
isstatus=`ps -ef | awk '{print $1}' | grep "nginx" | wc -l`
start()
{
    if [ $isstatus -ne 0 ]
    then
       echo "nginx already started"
    else
       $PROG
       $PROG_FPM
       echo "nginx starting......"
    fi
}
stop()
{   
    if [ $isstatus -ne 0 ]
    then
       kill -s QUIT $(cat $PIDF)
       kill -s QUIT $(cat $PID_FPM)
       echo "nginx shutting down......"
    else
       echo "nginx has ceased"
    fi
}
restart()
{   
    if [ $isstatus -ne 0 ]
    then
       kill -s QUIT $(cat $PIDF)
       kill -s QUIT $(cat $PID_FPM)
       $PROG
       $PROG_FPM
       echo "nginx restart......"
    else
       echo "nginx not started"
    fi
}
reload()
{
       kill -s HUP $(cat $PIDF)
       kill -s HUP $(cat $PID_FPM)
       echo "nginx is reloading......"
}
status()
{
    if [ $isstatus -eq 0 ]
       then
         echo "nginx:nginx not running"
       else
         echo "nginx:mginx is running"
   fi 
}
case "$1" in
start)
     start
     ;;
stop)
     stop
     ;;
restart)
     restart
     ;;
reload)
     reload
     ;;
status)
     status
     ;; 
*)
    echo "Usage:$0 {start|stop|restart|reload|status}" 
esac

注意:记得把脚本名字改成nginx,然后再放到/etc/init.d/目录下,之后就可以使用service命令管理了

启动服务:service nginx start     停止服务:service nginx stop     重启服务:service nginx restart

查看服务:service nginx status    重新加载服务:service nginx reload

nginx主配置文件位置:/usr/local/nginx/conf/nginx.conf(源码包安装)

一、源码编译安装Nginx

1.安装支持软件,Nginx的配置需要pcre、zlib等软件

yum -y install pcre-devel zlib-devel

2.nginx默认以nobody运行,建议建立专用用户

useradd -M -s /sbin/nologin nginx

3.下载Nginx软件包解压安装

Nginx服务与LNMP部署以及管理优化_第1张图片

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module

make && make install

编译安装nginx选项:

--prefix=目录:设置Nginx的安装路径                          默认路径:/usr/local/nginx

--sbin-path=目录:设置Nginx的可执行文件路径         默认路径:prefix/sbin/nginx

--conf-path=目录:设置Nginx配置文件路径                默认路径:prefix/conf/nginx.conf

--pid-path=目录:设置Nginx pid文件路径                   默认路径:prefix/logs/nginx.pid

--error-log-path=目录:设置错误日志存放路径           默认路径:prefix/logs/error.log

--http-log-path=目录:设置访问日志存放路径            默认路径:prefix/logs/access.log

--user=用户名:设置运行Nginx的用户                       默认用户:nobody

--group=用户组名:设置运行Nginx的用户组              默认用户组:nobody

4.路径的优化

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin

5.检查优化以及配置文件

启动Nginx:nginx

对网页访问测试服务是否搭建成功(下图为Nginx的默认网页,能访问为成功)

Nginx服务与LNMP部署以及管理优化_第2张图片

二、MySQL数据库安装

1.安装依赖包:yum -y install ncurses-devel

2.安装cmake工具

Nginx服务与LNMP部署以及管理优化_第3张图片

然后gmake && gmake install

3.解压编译安装mysql

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc

Nginx服务与LNMP部署以及管理优化_第4张图片

然后make && make install

4.优化路径以及优化管理

Nginx服务与LNMP部署以及管理优化_第5张图片

运行/etc/profile文件(没有权限记得加权限)

5.初始化数据库,启动mysql服务

创建用户组和用户,设置为属主目录

/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql

路径优化

ln -s /usr/local/mysql/bin/* /usr/bin

下图为安装成功

Nginx服务与LNMP部署以及管理优化_第6张图片

三、PHP安装搭建

1.下载各种依赖包

yum -y install zilb zlib-devel libxml2-devel pcre pcre-devel libpng libpng-devel libjpeg libjpeg-devel freetype freetype-devel curl-devel gd

2.解压源码包并且编译安装

解压再到解压目录下编译

./configure --prefix=/usr/local/php5 --with-gd --with-curl --with-zlib --with-mysqli --with-mysql=/usr/local/mysql --with-config-file-path=/usr/local/php5 --enable-mbstring --enable-fpm --with-jpeg-dir=/usr/lib

然后安装:make && make install

复制配置文件模板使用

cp php.ini-development /usr/local/php5/php.ini

3.路径优化

ln -s /usr/local/php5/bin/* /usr/local/bin/

ln -s /usr/local/php5/sbin/* /usr/local/sbin/

4.实现nginx与PHP对接

useradd -M -s /sbin/nologin php

使用模板/usr/local/php5/etc/php-fpm.conf.default

cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf

配置模块配置文件:vim /usr/local/php5/etc/php-fpm.conf

pid = run/php-fpm.pid

user = php

group = php

PHP优化(可选)

pm.max_children = 50                    // 根据内存大小设置,一个进程大约 3M

pm.start_servers = 20                     //启动时开启的进程数

pm.min_spare_servers = 5             //最少空闲进程数

pm.max_spare_servers = 35           //最多空闲进程数

启动fpm进程:/usr/local/sbin/php-fpm

查询php-fpm是否启动(下图为启动):netstat -anpt | grep php-fpm

修改nginx.conf,在www.aaa.com网站中使用本地php环境:vim /usr/local/nginx/conf/nginx.conf

在server{}里添加如下:

location ~ \.php$ {
            root           /var/www/aaa;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

Nginx服务与LNMP部署以及管理优化_第7张图片

记得保存重启服务

测试

编写php文件

phpinfo();

?>

Nginx服务与LNMP部署以及管理优化_第8张图片

编写php文件测试数据库

Nginx服务与LNMP部署以及管理优化_第9张图片

出现以上错误说明mysql_connect这个模块将在未来弃用,请你使用mysqli或者PDO来替代

解决方法一(不建议,最好把报错显示出来):

display_errors=on改为off

解决方法二

修改php文件代码:mysql_connect改成mysqli_connect

成功如下图:

补充:安装ZendGuardLoader优化模块

cp ZendGuardLoader.so  /usr/local/php5/lib/php/

修改php.ini配置文件启用优化模块

zend_extension=/usr/local/php5/lib/php/ZendGuardLoader.so

zend_loader.enable=1

虚拟站点搭建

直接修改主配置文件添加一个server板块即可,配置如下图(基于域名):

vim /usr/local/nginx/conf/nginx.conf

Nginx服务与LNMP部署以及管理优化_第10张图片

四、Nginx+Apache动静分离

作用原理:Nginx静态页面的处理拥有更好的性能,用Nginx访问html而用Apache访问php

1.编译安装Apache之后修改配置文件端口改为8080

Listen 8080ServerName study2.renjie.com:8080

2.安装LAMP需要的php扩展包libmcrypt、mhash、mcrypt

3.重新编译php

./configure --prefix=/usr/local/php5 --with-mcrypt --with-apxs2=/usr/local/httpd/bin/apxs --with-gd --with-curl --with-zlib --with-mysqli --with-mysql=/usr/local/mysql --with-config-file-path=/usr/local/php5 --enable-mbstring --enable-fpm --with-jpeg-dir=/usr/lib

Apache主配置文件添加识别php

AddType application/x-httpd-php .phpDirectoryIndex index.php index.html

编写网页测试访问该地址8080端口和下面的php文件

Nginx服务与LNMP部署以及管理优化_第11张图片         Nginx服务与LNMP部署以及管理优化_第12张图片

最后修改Nginx主配置文件

添加

location ~ \.php$ {
            proxy_pass   http://www.cba.com;
  }

Nginx服务与LNMP部署以及管理优化_第13张图片

保存重启服务访问测试用Nginx下的www.bbb.com去访问Apache下的php网页

Nginx服务与LNMP部署以及管理优化_第14张图片  Nginx服务与LNMP部署以及管理优化_第15张图片

五、访问控制

基于授权的访问控制

下载工具安装:yum install -y  httpd-tools

1.生成用户密码认证文件

htpasswd  -c /usr/local/nginx/passwd.db webadmin

然后会让你输入密码并确认密码

2.修改passwd.db的权限为400 ,修改文件属主为nginx用户

3.修改配置文件,添加认证项

在要设置的站点location下添加

auth_basic "secret";

auth_basic_user_file  /usr/local/nginx/passwd.db;

基于地址限制的访问控制

直接在要设置的站点的location下设置

deny 192.168.0.100;

allow all;

Nginx服务与LNMP部署以及管理优化_第16张图片

六、Nginx管理优化

隐藏版本号

查询版本号:curl -I http://192.168.0.122(也可以把IP地址换成解析后的网址)

Nginx服务与LNMP部署以及管理优化_第17张图片

修改配置文件:vim /usr/local/nginx/conf/nginx.conf

在http里添加server_tokens off;就可以隐藏版本(记得重启服务生效)

Nginx服务与LNMP部署以及管理优化_第18张图片

Nginx服务与LNMP部署以及管理优化_第19张图片

补充:在编译之前修改安装包里nginx-1.17.8/src/core目录下的nginx.h文件

修改下面两个参数再编译安装,可以设置版本信息显示内容

#define NGINX_VERSION      "1.17.8"
#define NGINX_VER          "nginx/" NGINX_VERSION

 

修改用户组

Nginx运行时主进程是root创建,子进程由指定 的用户和组创建,Nginx默认使用的nobody

1.编译安装时指定用户和组

./configure –prefix=/usr/local/nginx –user=nginx –group=nginx –with-http_stub_status_module

2.编译安装完之后修改配置文件:vim /usr/local/nginx/conf/nginx.conf

user nginx nginx;

配置网页缓存时间

修改主配置文件:vim /usr/local/nginx/conf/nginx.conf

在网页块下新加一个location

日志切割

Nginx没有类似apache的cronlog日志分割处理能力,但是可以通过nginx的信号控制功能脚本来实现日志的分割

#!/bin/bash
#定义各种变量
date=`date -d "-1 day" +%Y%m%d`
logpath="/usr/local/nginx/logs"
pidpath="/usr/local/nginx/logs/nginx.pid"
#移动日志到存放目录
[ -d $logpath ] || mkdir -p $logpath
mv /usr/local/nginx/logs/access.log ${logpath}/www..access.log.$date
#重新创建日志目录
kill -HUP `cat $pidpath`
#定期删除多余的日志文件(删除30天之前的)
find $logpath -mtime +30 | xargs rm -rf

nginx 1.16版本开始自带了日志切割功能,而1.12版本,目前有几种办法可以做到按天切割

设置连接超时

为了避免一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间

修改配置文件:vim /usr/local/nginx/conf/nginx.conf

Keepalive_timeout 65 180 ;  \\默认时间65 超时时间180

进程优化

优化nginx进程数量,修改 Nginx 的配置文件的 worker_processes 参数,一般设为 CPU 的个数或者核数, 在高并发的情况下可设置为 CPU 个数或者核数的 2 倍,可以查看 CPU 的核数以确定参数

查看进程:cat /proc/cpuinfo | grep -c "physical"

默认情况,nginx的多个进程可能更多的跑在一个CPU上,可以分配不同的进程给 不同的 CPU 处理,充分利用硬件多核多 CPU,在一台 4 核 CPU 服务器上,可以设置每个 进程分别由不同的 CPU 核心处理,达到 CPU 的性能最大化

修改配置文件:vim /usr/local/nginx/conf/nginx.conf

worker_processes 4;     \\开启进程数

worker_cpu_affinity 0001 0010 0100 1000  \\逻辑CPU

补充:1.16版本

work_processes auto;

网页压缩

Nginx 的 ngx_http_gzip_module 压缩模块提供了对文件内容压缩的功能,默认nginx已经安装此模块

修改配置文件:vim /usr/local/nginx/conf/nginx.conf

 gzip  on;                    \\开启gzip压缩输出

gzip_min_length 1k;       \\用于设置允许压缩的页面最小字节数

gzip_buffers 4 16k;       \\表示申请 4 个单位为 16k 的内存作为压缩结果流缓存,默认值 是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果

gZip_http_version 1.0;     \\用于设置识别 http 协议版本,默认是 1.1,目前大部分浏览 器已经支持 gzip 解压,但处理最慢,也比较消耗服务器 CPU 资源

Gzip_comp_level2;         \\用来指定 gzip 压缩比,1 压缩比最小,处理速度最快;9 压缩 比最大,传输速度快,但处理速度最慢,使用默认即可

Gzip_types text/plain;          \\压缩类型,是对哪些网页文档启用压缩功能

Gzip_vary on;        \\选项可以让前端的缓存服务器缓存经过 gzip 压缩的页面

防盗链

Nginx 的防盗链原理是加入 location 项,用正则表达式过滤图片类型文件,对于信任的 网址可以正常使用,不信任的网址返回相应的错误图片

修改配置文件:vim /usr/local/nginx/conf/nginx.conf

在需要设置的网页段下面添加location

location ~*\.(png|jpg|gif|swf)$ {
                valid_referers none blocked *.bbb.com bbb.com;
                if ($invalid_referer) {
                        rewrite ^/http://www.aaa.com/error.jpg;
                }   
        }

FPM参数优化

Nginx的PHP解析功能实现其中一种是交给FPM处理,如果要提供nginx对PHP的处理速度,需要对FPM进行优化

修改配置文件:vim /usr/local/php5/etc/php-fpm.conf

pm = dynamic / static;         \\static(静态)或者dynamic(动态)

pm.max_children = 5;       \\如果静态方式开启的php-fpm进程数,在动态方式下他限定php-fpm的最大进程数

pm.start_servers = 2;       \\动态情况下初始启动的进程数

pm.max_spare_servers = 3;     \\动态情况下最大的空闲进程

pm.min_spare_servers = 5;     \\动态情况下最小的空闲进程

pm.max_requests = 500;      \\最大的请求数

补充:建议设置

pm=dynamic;

pm.max_children=20;

pm.start_servers=5;

pm.min_spare_servers=5;

pm.max_spare_servers=20;

这样可以最大的节省内存并提高执行效率

 

你可能感兴趣的:(Linux系统与服务)