一、nginx服务基础
1.1 Nginx简介
高性能、轻量级 Web 服务软件;稳定性高;系统资源消耗低;
对HTTP 并发连接的处理能力高(单台物理服务器可支持30 000~50 000个并发请求)
Nginx 并发 连接能力 受2个因素影响:1、CPU 个数 ;2、本地物理服务器系统的最大打开文件数
RamBler : http://www.rambler.ru/nginx: http://nginx.org/Mainline version 主线版本Stable version稳定版本旧版本下载: http://mirrors.sohu.com/nginx/Nginx 中文参考地址 : http://www.nginx.cn/doc/
1.2 Nginx 功能介绍
1.3 基础特性
1.4 Web 服务相关的功能
https://blog.csdn.net/Lzcsfg/article/details/139869821
1.5 nginx 应用场景
1.6 Nginx和Apache的差异
Nginx 位于七层和四层(应用层、传输层);Apache 位于七层(应用层)
Nginx通过反向代理连接 PHP ;Apache 直接连接 PHP
1.7 Nginx 相对于 Apache 的优点
Apache 相对于 Nginx 的优点:
1.8 Nginx 架构
上图是 Nginx 的进程模型,下面我们会简单讲解图中不同部分的含义:既然 worker 进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供 80 端口的 http服务时,一个连接请求过来,每个进程都有可能处理这个连接。那么问题来了,到底最后怎样处理,是由什么决定的呢?我们来看一看一个完整的请求是怎样通过互相的协作来实现的:( 1 )首先,每个 worker 进程都是从 master 进程 fork 过来,在 master 进程里面,先建立好需要listen 的 **socket ( listenfd ) ** 之后,然后再 fork 出多个 worker 进程。( 2 )所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker 进程会在注册 listenfd 读事件前抢 accept_mutex ,抢到互斥锁的那个进程注册 listenfd读事件,然后在读事件里调用 accept 接受该连接。(解决惊群)( 3 )当一个 worker 进程在 accept 这个连接之后,就开始读取请求、解析请求、处理请求。产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到:一个请求,完全由 worker 进程来处理,而且只在一个 worker 进程中处理。也许你还有个疑问,那就是 Nginx 采用多 worker 的方式来处理请求,每个 worker 里面只有一个主线程,那能够处理的并发数很有限啊,多少个 worker 就能处理多少个并发,何来高并发呢?这就是 Nginx 的高明之处,Nginx 采用了 异步非阻塞 的方式来处理请求,也就是说, Nginx 是可以同时处理成千上万个请求的。这里补充一下异步非阻塞的概念:异步的概念是和同步相对的,也就是不同事件之间不是同时发生的。非阻塞的概念是和阻塞对应的, 阻塞是事件按顺序执行 ,每一事件都要等待上一事件的完成,而非阻塞是如果事件没有准备好,这个事件可以直接返回,过一段时间再进行处理询问,这期间可以做其他事情。(一个操作开始后,程序不需要等待这个操作完成就可以继续做其他事情)有点类似协程
socket(套接字): ip+端口号
1.9 Nginx 进程结构
所有 Worker 进程都是平等的实际处理:网络请求,由 Worker 进程处理Worker 进程数量:一般设置为核心数,充分利用 CPU 资源,同时避免进程数量过多,导致进程竞争 CPU 资源,(4核,最多4个进程)增加上下文切换的损耗接受处理客户的请求将请求依次送入各个功能模块进行处理I/O 调用,获取响应数据与后端服务器通信,接收后端服务器的处理结果缓存数据,访问缓存索引(类似 目录),查询和调用缓存数据发送请求结果,响应客户的请求接收主程序(Nginx程序(应用))指令,比如重启、升级和退出等
Master创建文件的快捷方式,再fork多个子进程,把子进程变成读的状态,让所有的work进程注册到事件,让work进程去处理事件
1.10 nginx 模块 *
ngx_http_core_module 核心模块ngx_http_access_module 访问控制ngx_http_auth_basic_module 身份验证ngx_http_gzip_module 压缩模块ngx_http_log_module 日志模块ngx_http_proxy_module 代理模块ngx_http_rewrite_module 重写模块ngx_http_stub_status_module 状态页模块ngx_http_upstream_module 反向代理ngx_http_stream_module 四层代理核心模块: core module标准模块:HTTP 模块: ngx_http_* HTTPS模块(ssl)HTTP Core modules # 默认功能HTTP Optional modules # 需编译时指定Mail 模块 : ngx_mail_*Stream 模块 ngx_stream_*第三方模块
二、编译安装nginx 服务
(一般都是编译安装,不用yum)
2.0 扩展 在线 yum 安装nginx
yum install epel-release -y #安装 epel-release 扩展源
yum install nginx -y # 安装 nginx 服务
2.1 nginx编译安装 *
虚拟机设置 2核4G 就行
systemctl stop firewalldsystemctl disable firewalldsetenforce 0
2.2安装依赖包
#nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库 和头文件。
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
2.3 创建运行用户与组
[root@localhost opt]# useradd -M -s /sbin/nologin nginx
[root@localhost opt]# tail /etc/passwdnginx:x:1001:1001::/home/nginx:/sbin/nologin
2.4 编译安装Nginx
nginx 1.12.0 版本
[root@localhost~]# cd /opt[root@localhost opt]# tar zxvf nginx-1.12.0.tar.gz -C /opt/[root@localhost nginx-1.12.2]# cd nginx-1.12.0/./configure \--prefix=/usr/local/nginx \ # 指定 nginx 的安装路径--user=nginx \ # 指定用户名--group=nginx \ # 指定组名--with-http_stub_status_module #启用 http_stub_status_module 模块以支持状态统计操作 VTS[root@localhost nginx-1.12.2]# cd nginx-1.12.0/./configure \--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_stub_status_module[root@localhost nginx-1.12.2]# make && make install
安装 nginx 1.18.0版本
[root@localhost~]# tar zxvf nginx-1.18.0.tar.gz -C /opt/yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel./configure --help# 查看帮助模块./configure --prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_ssl_module \--with-http_v2_module \--with-http_realip_module \--with-http_stub_status_module \--with-http_gzip_static_module \--with-pcre \--with-stream \--with-stream_ssl_module \--with-stream_realip_module
2、给 nginx 权限
[root@localhost nginx]# cd /usr/local/nginx/
[root@localhost nginx]# chown -R nginx.nginx /usr/local/nginx/
[root@localhost nginx]# ll
总用量 4
drwxr-xr-x. 2 nginx nginx 4096 8月 9 15:17 conf
drwxr-xr-x. 2 nginx nginx 40 8月 9 15:17 html
drwxr-xr-x. 2 nginx nginx 6 8月 9 15:17 logs
drwxr-xr-x. 2 nginx nginx 19 8月 9 15:17 sbin
此时可以查看 nginx版本
[root@localhost ~]# cd /usr/local/nginx/sbin
[root@localhost sbin]# ls
nginx[root@localhost sbin]# ./nginx -V #查看nginx版本
nginx version: nginx/1.12.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ # 让系统识别 nginx 的操作命令启动 检查nginx -t # 检查配置文件是否配置正确# 启动
2.5 Nginx 信号
[root@node2 ~]#nginx -h-v : show version and exit-V : show version and configure options then exit-t : test configuration and exit-T : test configuration, dump it and exit-q : suppress non-error messages during configuration testing-s signal : send signal to a master process: stop, quit, reopen , reload-p prefix : set prefix path (default: /etc/nginx/)-e filename : set error log file (default: /var/log/nginx/error.log)-c filename : set configuration file (default: /etc/nginx/nginx.conf)-g directives : set global directives out of configuration filenginx -t 检查语法nginx -T 检查语法 并打印所有配置nginx -v 显示版本nginx -V 显示详细信息, 包括 编译的信息nginx -c 指定配置文件启动nginx -s = kill 发送信号nginx -s relaod 重新加载配置文件nginx -s stop 停止 nginx 立即停止nginx -s quit 优雅的退出 , 如果有人在访问我的服务, 那么不会立即关闭, 等客户断开连接再 退出nginx -s reopen 重新生成日志文件 USR1 日志 有关nginx -s USR2 飞行中升级
nginx
命令
|
kill
命令
| 含义 |
nginx -s relaod
|
kill -s HUP
|
重新加载配置文件
|
nginx -s stop
|
kill -9
(
KILL
)
| 立即停止 |
nginx -s quit
|
kill -3
(
QUITt
)
| 优雅的退出 |
nginx -s reopen
|
kill -s USR1
| 重新生成日志文件 |
nginx
|
kill -s USR2
| 飞行中升级 |
nginx新版本升级:
tar -zxvf nginx-1.xx.xx.tar.gz 1.22.0cd nginx-1.xx.xx./configure \--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_stub_status_module \--with-http_ssl_modulemakemv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old 备份cp /opt/nginx-1.××/objs/nginx /usr/local/nginx/sbin/nginx重启服务 并且./nginx -V # 查看版本make upgrade# 或者先 killall nginx ,再 /usr/local/nginx/sbin/nginx
例:Nginx 1.12 升级到 1.22
1、tar解包
2、./configuretar zxvf nginx-1.22.0.tar.gz
[root@localhost opt]# cd nginx-1.22.0/
[root@localhost nginx-1.22.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
[root@localhost nginx-1.22.0]# make
3、把 /usr/local/nginx/sbin/nginx 备份成 /usr/local/nginx/sbin/nginx.bak
4、把 /opt/nginx-1.22.0/objs/nginx 复制到 /usr/local/nginx/sbin/nginx
5、重新启动 nginx 服务,查看版本
2.6 添加 Nginx 系统服务
vim /etc/init.d/nginx#!/bin/bash#chkconfig: 35 99 20 // 这是固定格式, 2345 表示运行级别,之后为开机执行顺序和关机执行顺序#description:Nginx Service Control Script // 这也是必须的COM="/usr/local/nginx/sbin/nginx"PID="/usr/local/nginx/logs/nginx.pid"case "$1" instart)$COM;;stop)kill -s QUIT $(cat $PID);;restart)$0 stop$0 start;;reload)kill -s HUP $(cat $PID);;*)echo "Usage: $0 {start|stop|restart|reload}"exit 1esacexit 0chmod +x /etc/init.d/nginxchkconfig --add nginx # 添加为系统服务systemctl stop nginxsystemctl start nginxservice nginx start|stop|restart|reload
vim /lib/systemd/system/nginx.service[Unit]Description=nginxAfter=network.target[Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStart=/usr/local/nginx/sbin/nginxExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true[Install]WantedBy=multi-user.target---------------------------------------------------------[Unit]: 服务的说明Description: 描述服务After: 依赖,当依赖的服务启动之后再启动自定义的服务[Service] 服务运行参数的设置Type=forking 是后台运行的形式,使用此启动类型应同时指定PIDFile 以便 systemd 能够跟踪服务的主进程。ExecStart 为服务的具体运行命令ExecReload 为重启命令ExecStop 为停止命令PrivateTmp=True 表示给服务分配独立的临时空间注意:启动、重启、停止命令全部要求使用绝对路径[Install] 服务安装的相关设置,可设置为多用户---------------------------------------------------------chmod 754 /lib/systemd/system/nginx.servicesystemctl start nginx.servicesystemctl enable nginx.service
实验:
[root@localhost sbin]# vim /lib/systemd/system/nginx.service
[Unit]Description=nginxAfter=network.target[Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStart=/usr/local/nginx/sbin/nginxExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true[Install]WantedBy=multi-user.target[root@localhost sbin]# chmod 754 /lib/systemd/system/nginx.service
[root@localhost sbin]# systemctl daemon-reload #重新加载配置文件
[root@localhost sbin]# systemctl enable nginx.service #nginx开机自启动
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@localhost sbin]# systemctl start nginx.service #开启nginx服务
[root@localhost sbin]# lsof -i:80 #查看httpd端口是否开启
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 64255 root 6u IPv4 122407 0t0 TCP *:http (LISTEN)
nginx 64256 nginx 6u IPv4 122407 0t0 TCP *:http (LISTEN)
三、nginx主配置文件nginx.conf *
3.1 全局配置 *
#user nobody; #运行用户,若编译时未指定则默认为 nobody
worker_processes 4; #工作进程数量,可配置成服务器内核数 * 2,如果网站访问量不大,一般设为1就够用了
CPU
2P:2个物理CPU
4C:1物理核有4个核心一共有2*4=8个逻辑核
8G内存
4C 16G 高效盘 40G (系统盘) 存储 oss 网络存储 nas 50M
master_processes off/on #Master 进程 开启/关闭 (默认开启,一般不动)
#error_log logs/error.log; #错误日志文件的位置 /usr/local/nginx/logs/error.log
#pid logs/nginx.pid; #PID 文件的位置 /usr/local/nginx/logs/nginx.pid
3.2 events I/O 事件配置 *
什么是epoll:
epoll 把所有事件记录在列表当中,当列表中的事件处理完之后 会通知epoll 我的事件处理完了,需要你处理我的事件,而不是一个一个问事件处理好了没有,这样就可以处理大量并发
epoll 用来优化
epoll 只能在 events 里使用
events {
use epoll; #使用 epoll 模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
worker_connections 4096; #每个进程处理 4096 个连接(worker_connections每个 worker 进程可以同时处理的最大连接数,默认1024) 2000
}
# 如提高每个进程的连接数还需执行 “ulimit -n 65535” 命令临时修改本地每个进程可以同时打开的最大文件数。# 在 Linux 平台上,在进行高并发 TCP 连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制( 这是因为系统为每个 TCP 连接都要创建一个 socket 句柄,每个 socket 句柄同时也是一个文件句柄) 。# 可使用 ulimit -a 命令查看系统允许当前用户进程打开的文件数限制。vim /etc/security/limits.conf #永久修改进程最大打开文件数#epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
若工作进程数为 8 ,每个进程处理 4 096 个连接,则允许 Nginx 正常提供服务的连接数已超过 3 万个( 4 096×8=32 768 ),当然具体还要看服务器硬件、网络带宽等物理条件的性能表现。
[root@localhost security]# ulimit -n 65535 (0-65535 一共 65536 个进程)[root@localhost security]# ulimit -a
永久修改进程最大打开文件数
[root@localhost security]# vim /etc/security/limits.conf
3.3 HTTP 配置 *
每一个 server 都是一个网站
location 匹配网页(匹配网站目录)
怎么匹配多个网页? 在location后面加路径就行
http {
##文件扩展名与文件类型映射表(文本文件、图像、视频)
include mime.types; #在/usr/local/nginx/conf/mime.types
##默认文件类型
default_type application/octet-stream;
##日志格式设定
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
##访问日志位置
#access_log logs/access.log main;
##支持文件发送(下载)
sendfile on;
##此选项允许或禁止使用socket的TCP_CORK的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用
#tcp_nopush on;
##连接保持超时时间,单位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
##gzip模块设置,设置是否开启gzip压缩输出
#gzip on;
##Web 服务的监听配置
server { #每一个 server 都是一个网站
##监听地址及端口(任何一个端口,只要在 0-65535 之间)
listen 80;
##站点域名,可以有多个,用空格隔开
server_name www.kgc.com;
##网页的默认字符集(默认是俄语)
charset utf-8;
##根目录配置
location / { #location 匹配网站目录
##网站根目录的位置/usr/local/nginx/html
root html;
##默认首页文件名
index index.html index.php;
}
##内部错误的反馈页面
error_page 500 502 503 504 /50x.html;
##错误页面配置
location = /50x.html {
root html;
}
}
}================================================================================日志格式设定:$remote_addr 与 $http_x_forwarded_for 用以记录客户端的 ip 地址;$remote_user :用来记录客户端用户名称;$time_local : 用来记录访问时间与时区;$request : 用来记录请求的 url 与 http 协议;$status : 用来记录请求状态;成功是 200 ,$body_bytes_sent :记录发送给客户端文件主体内容大小;$http_referer :用来记录从哪个页面链接访问过来的;$http_user_agent :记录客户浏览器的相关信息;通常 web 服务器放在反向代理的后面,这样就不能获取到客户的 IP 地址了,通过 $remote_add 拿到的 IP 地址是反向代理服务器的iP 地址。反向代理服务器在转发请求的 http 头信息中,可以增加 x_forwarded_for 信息,用以记录原有客户端的IP 地址和原来客户端的请求的服务器地址。location 常见配置指令, root 、 alias 、 proxy_passroot (根路径配置): root /var/www/html 编译安装 /usr/local/nginx/html请求 www.kgc.com/test/1.html ,会返回文件 /var/www/html/test/1.htmlalias (别名配置): alias /var/www/html请求 www.kgc.com/test/1.html ,会返回文件 /var/www/html/1.htmlproxy_pass (反向代理配置)
四、实战案列
4.1 Nginx的访问状态统计
--------访问状态统计配置--------
1. 查看已安装的 Nginx 是否包含HTTP_STUB_STATUS 模块
[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
[root@localhost ~]# cat /opt/nginx-1.22.0/auto/options |grep YES
#可查看 nginx 已安装的所有模块
2.修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置
[root@localhost ~]# cd /usr/local/nginx/conf/
[root@localhost conf]# cp nginx.conf nginx.conf.bak 或 cp nginx.conf{,_bak} #备份
[root@localhost conf]# vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 80;
server_name www.kgc.com;
charset utf-8;
location / {
root html;
index index.html index.php;
}
##添加 stub_status 配置##
location /status { #访问位置为/status
stub_status on; # 打开状态统计功能access_log off; # 关闭此位置的日志记录}}}3. 重启服务,访问测试[root@localhost conf]# nginx -t #检查语法[root@localhost conf]# systemctl restart nginx.service #重启nginx服务浏览器访问 http://192.168.10.19/statusActive connections :表示当前的活动连接数;server accepts handled requests :表示已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCP 握手次数、 已处理的请求数。[root@localhost conf]# curl -s http://192.168.10.19/status 统计网页访问量可结合 awk 与 if 语句进行性能监控。
location 每一行结束都要加 ;不然会报错
4.2 基于授权的访问控制(账户、密码)
应用场景:企业内部,会给每个员工一个文档,包含用户名密码,只有企业内部人员才能登录
httpd-tools 下的 htpasswd (生成 HTTP 用户密码认证文件的工具) 、 ab(压力测试工具)
--------基于授权的访问控制--------
1.生成用户密码认证文件
[root@localhost conf]# yum install -y httpd-tools
[root@localhost conf]# htpasswd -c /usr/local/nginx/passwd.db yss
New password:
Re-type new password:
Adding password for user yss[root@localhost nginx]# chown nginx /usr/local/nginx/passwd.db
passwd.db属主改为nginx
[root@localhost nginx]# chmod 400 /usr/local/nginx/passwd.db
passwd.db属主设为只读2.修改主配置文件相对应目录,添加认证配置项
vim /usr/local/nginx/conf/nginx.conf
......
server {
location / {
......
##添加认证配置##
auth_basic "secret"; #设置密码提示框文字信息
auth_basic_user_file /usr/local/nginx/passwd.db;
}
}
3.重启服务,访问测试
[root@localhost nginx]# nginx -t
[root@localhost nginx]# systemctl restart nginx
4、浏览器访问 http://192.168.190.50
需要填写用户名、密码
访问网页 http://192.168.190.50
4.3 基于客户端的访问控制(黑白名单)
使用情况:防止黑客攻击;禁止谁访问
--------基于客户端的访问控制--------
访问控制规则如下:
deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。
规则从上往下执行,如匹配则停止,不再往下匹配。
vim /usr/local/nginx/conf/nginx.conf
......
server {
location / {
......
##添加控制规则##
allow 192.168.10.20; #允许访问的客户端 IP
deny all; #拒绝其它IP客户端访问
}
}
[root@localhost nginx]# nginx -t #检查语法
[root@localhost nginx]# systemctl restart nginx
4.4 基于域名的 Nginx 虚拟主机
--------基于域名的 Nginx 虚拟主机--------
1.为虚拟主机提供域名解析
echo "192.168.190.50 www.kgc.com www.benet.com" >> /etc/hosts
2.为虚拟主机准备网页文档
mkdir -p /usr/local/nginx/html/benet
mkdir -p /usr/local/nginx/html/kgc
echo "<h1>www.kgc.com</h1>" > /usr/local/nginx/html/kgc/index.html
echo "<h1>www.benet.com</h1>" > /usr/local/nginx/html/benet/index.html
3.修改Nginx的配置文件
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 80;
server_name www.kgc.com; #设置域名www.kgc.com
charset utf-8;
access_log logs/www.kgc.access.log; #设置日志名
location / {
root /usr/local/nginx/html/kgc; #设置www.kgc.com 的工作目录
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 80;
server_name www.benet.com; #设置域名www.benet.com
charset utf-8;
access_log logs/www.benet.access.log;
location / {
root /usr/local/nginx/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
4.重启服务,访问测试
nginx -t
systemctl restart nginx
浏览器访问
4.5 基于IP 的 Nginx 虚拟主机
ifconfig ens33:0 192.168.190.40 netmask 255.255.255.0
ip a
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 192.168.190.40:80; #设置监听地址192.168.10.19
server_name www.kgc.com;
charset utf-8;
access_log logs/www.kgc.access.log;
location / {
root /usr/local/nginx/html/kgc;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 192.168.190.50:80; #设置监听地址192.168.10.40
server_name www.benet.com;
charset utf-8;
access_log logs/www.benet.access.log;
location / {
root /usr/local/nginx/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
nginx -t # 报错的话在 /usr/local/nginx/logs/error.log 下,查看日志
systemctl restart nginx
浏览器访问
4.6 基于端口的 Nginx 虚拟主机
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 192.168.190.50:8080; #设置监听 8080 端口
server_name www.kgc.com;
charset utf-8;
access_log logs/www.kgc.access.log;
location / {
root /usr/local/nginx/html/kgc;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 192.168.190.50:8888; #设置监听 8888 端口
server_name www.benet.com;
charset utf-8;
access_log logs/www.benet.access.log;
location / {
root /usr/local/nginx/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
systemctl restart nginx
浏览器访问
五、LNMP架构
5.1安装 Nginx 服务
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1、安装依赖包
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
2、创建运行用户
useradd -M -s /sbin/nologin nginx
3、编译安装
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/''.6hvcfcd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_modulemake && make install
4、优化路径
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
5、添加 Nginx 系统服务
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.targetchmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
5.2安装 MySQL 服务
1、安装Mysql环境依赖包
yum -y install \
ncurses \
ncurses-devel \
bison \
cmake
2、创建运行用户
useradd -M -s /sbin/nologin mysql
tail /etc/paswsd
3、编译安装
cd /opt
tar zxvf mysql-boost-5.7.20.tar.gzcd /opt/mysql-5.7.20/
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1make && make install
4、修改mysql 配置文件
vim /etc/my.cnf
[client]
port = 3306
socket=/usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
5、更改mysql安装目录和配置文件的属主属组
chown -R mysql:mysql /usr/local/mysql/
chown mysql:mysql /etc/my.cnf
6、设置路径环境变量
echo 'export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
source /etc/profile
7、初始化数据库
cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
8、添加mysqld系统服务
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl start mysqld.service
systemctl enable mysqld
9、修改mysql 的登录密码
mysqladmin -u root -p password "abc123"
10、授权远程登录
mysql -u root -p
【安装配置 PHP 解析环境】
1、安装环境依赖包
yum -y install gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel
2、编译安装
cd /opt
tar jxvf php-7.1.10.tar.bz2
cd php-7.1.10
./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip
make && make install
3、路径优化
ln -s /usr/local/php/bin/* /usr/local/bin/
ln -s /usr/local/php/sbin/* /usr/local/sbin/
4、调整PHP配置文件
php有三个配置文件:
php.ini 主配置文件
php-fpm.conf 进程服务配置文件
www.conf 扩展配置文件
#调整主配置文件:
cp /opt/php-7.1.10/php.ini-development /usr/local/php/lib/php.ini
vim /usr/local/php/lib/php.ini
--1170行--修改
mysqli.default_socket = /usr/local/mysql/mysql.sock
--939行--取消注释,修改
date.timezone = Asia/Shanghai
php -m #验证安装的模块
#调整进程服务配置文件:
cd /usr/local/php/etc/
cp php-fpm.conf.default php-fpm.conf
vim php-fpm.conf
--17行--去掉";"注释
pid = run/php-fpm.pid
#调整扩展配置文件:
cd /usr/local/php /etc/php-fpm.d/
cp www.conf.default www.conf
5、启动php-fpm
/usr/local/php/sbin/php-fpm -c /usr/local/php/lib/php.ini
netstat -anpt | grep 9000
#PHP-FPM(FastCGI Process Manager:FastCGI 进程管理器)是一个 PHPFastCGI 管理器, 由于Nginx服务器不能处理动态页面,需要由 Nginx 把动态请求交给 php-fpm 进程进行解析。
cd /opt/php-7.1.10/sapi/fpm
cp php-fpm.service /usr/lib/systemd/system/php-fpm.service
systemctl restart php-fpm.service
6、配置 Nginx 支持 PHP 解析
vim /usr/local/nginx/conf/nginx.conf
--65行--取消注释,修改
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; #将 /scripts 修改为nginx的工作目录
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #$document_root 代表当前请求在root指令中指定的值
include fastcgi_params;
}
systemctl restart nginx.service
7、验证PHP 测试页
vim /usr/local/nginx/html/index.php
<?php
phpinfo();
?>
浏览器访问
http://192.168.80.10/index.php
8、验证数据库工作是否正常
mysql -u root -p
CREATE DATABASE bbs;
GRANT all ON bbs.* TO 'bbsuser'@'%' IDENTIFIED BY 'admin123';
GRANT all ON bbs.* TO 'bbsuser'@'localhost' IDENTIFIED BY 'admin123';
flush privileges;
vim /usr/local/nginx/html/index.php #替换原来的测试页内容
<?php
$link=mysqli_connect('192.168.80.10','bbsuser','admin123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
?>
浏览器访问
http://192.168.80.10/index.php
【部署 Discuz!社区论坛 Web 应用】
cd /opt
unzip Discuz_X3.4_SC_UTF8.zip -d /opt/dis
cd /opt/dis/dir_SC_UTF8/
cp -r upload/ /usr/local/nginx/html/bbs/
调整论坛目录的权限:
cd /usr/local/nginx/html/bbs/
chown -R nginx ./config/
chown -R nginx ./data/
chown -R nginx ./uc_client/
chown -R nginx ./uc_server/
或
chmod -R 777 ./config/
chmod -R 777 ./data/
chmod -R 777 ./uc_client/
chmod -R 777 ./uc_server/
论坛页面访问
http://192.168.80.10/bbs/install/index.php
----------------------------------------------------------------------------------------------------------
数据库服务器:localhost ###本地架设就用localhost,如何不是在在本机上就要填写IP地址和端口号
数据库名字:bbs
数据库用户名:bbsuser
数据库密码:admin123
管理员账号:admin
管理员密码:admin123
----------------------------------------------------------------------------------------------------------
访问论坛页面:
http://192.168.80.10/bbs/index.php
http://192.168.80.10/bbs/admin.php
----------------fpm参数优化-------------------
vim /usr/local/php/etc/php-fpm.conf
pid = run/php-fpm.pid
vim /usr/local/php/etc/php-fpm.d/www.conf
--96行--
pm = dynamic #fpm进程启动方式,动态的
--107行--
pm.max_children=20 #fpm进程启动的最大进程数
--112行--
pm.start_servers = 5 #动态方式下启动时默认开启的进程数,在最小和最大之间
--117行--
pm.min_spare_servers = 2 #动态方式下最小空闲进程数
--122行--
pm.max_spare_servers = 8 #动态方式下最大空闲进程数
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid` #重启php-fpm
netstat -anpt | grep 9000
ps -elf | grep php-fpm
六、Nginx相对于Apache的优势
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » Nginx网站服务
发表评论 取消回复