Nginx服务基础
Nginx是一款高性能、轻量级的反向代理Web服务器,用于 HTTP、 HTTPS、SMTP、POP3和IMAP 协议。它实现非常高效的反向代理、负载平衡,它可以处理2-3万并发连接数,官方监测能支持5万并发。
Nginx优点
- 轻量级:系统资源消耗较少
- 高性能:抗并发能力较强,一般可以处理2~3万并发连接数,最多理论上可支持5万并发
- 稳定性高:宕机的概率小
Nginx主要应用场景
- web网站服务
- 虚拟主机(基于域名、IP、端口)
- 反向代理
- web前端缓存
Nginx 和 Apache 的差异
- nginx更轻量,比apache占用更少的内存资源
- nginx抗并发能力更强
- nginx是模块化设计,配置相对简单,组传也比较apache少
- nginx处理请求是异步非阻塞,apache是同步阻塞性的
- nginx可以多个连接对应一个进程,apache是一个连接对应一个进程
- nginx是基于事件的web服务器,apache是基于流程的web服务器
同步和异步
- 同步:一个服务的完成需要依赖其他服务时,只有等待被依赖的服务完成后,才算完成,这是一种可靠的服务序列。要么成功都成功,失败都失败,服务的状态可以保持一致
- 异步:一个服务的完成需要依赖其他服务时,只通知其他依赖服务开始执行,而不需要等待被依赖的服务完成,此时该服务就算完成了。被依赖的服务是否最终完成无法确定,因此它是一个不可靠的服务序列。
阻塞与非阻塞
- 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务,函数只有在得到结果之后才会返回。
- 非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
编译安装Nginx服务
-
关闭防火墙,将安装nginx所需软件包传到/opt目录下的nginx目录中
-
安装依赖包,nginx的配置及运行需要pcre、zlib、openssl等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。
-
创建运行用户、组。Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限。
-
编译安装Nginx
-
检查、启动、重启、停止 nginx服务
-
检查:nginx -t
-
启动:nginx
-
停止:kill -3
-
重载(不重启的情况下,重新读取配置文件):kill -1
kill -1 <PID号>
kill -s HUP <PID号>
killall -1 nginx
killall -s HUP nginx -
日志分割,重新打开日志文件
-
平滑升级
-
-
添加 Nginx 系统服务
-
方法一
-
方法二
-
Nginx服务的主配置文件 nginx.conf
文件位置:/usr/local/nginx/conf/nginx.conf
- 全局块:全局配置,对全局生效
- events块:配置影响 Nginx 服务器与用户的网络连接
- http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
- server块:配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块
- location块:用于配置匹配的 uri
- upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分
过滤出未被注释的配置信息
全局配置
- master_processes:主进程,用于管理工作进程
- worker_processes:工作进程,用于处理用户连接
I/O 事件配置
工作进程最大连接数 = work_processes * work_connections
如提高每个进程的连接数还需执行“ulimit -n 65535”命令临时修改本地每个进程可以同时打开的最大文件数。
在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。
需永久配置,修改配置文件:/etc/security/limits.conf
然后退出当前会话,重新登录。即可生效,重启配置也会保留。
epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
HTTP配置
日志格式设定
- $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常见配置指令
括号外为location /test {...}
- root(根路径配置):root /var/www/html(上面的/test为匹配的子目录)
请求www.abc.com/test/1.html,会返回文件/var/www/html/test/1.html - alias(别名配置):alias /var/www/html
请求www.abc.com/test/1.html,会返回文件/var/www/html/1.html - proxy_pass(反向代理配置)
Nginx虚拟主机
基于域名的 Nginx 虚拟主机
-
为虚拟主机提供域名解析
-
为虚拟主机准备网页文档
-
修改Nginx的配置文件
-
重启服务(systemctl restart nginx),访问测试
基于IP 的 Nginx 虚拟主机
-
设置虚拟网络接口
-
修改Nginx的配置文件
-
重启服务(systemctl restart nginx),访问测试
基于端口的 Nginx 虚拟主机
-
修改Nginx的配置文件
-
重启服务(systemctl restart nginx),访问测试
Nginx访问控制
访问状态统计配置
-
先使用命令/usr/local/nginx/sbin/nginx -V 查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块
查看 nginx 已安装的所有模块
-
修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置
-
重启服务,访问测试
curl -Ls http://192.168.44.30/status 结合 awk与if 语句进行性能监控。
基于授权的访问控制
-
生成用户密码认证文件
-
修改主配置文件相对应目录,添加认证配置项
-
重启服务,访问测试
基于客户端的访问控制
访问控制规则如下:
- deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
- allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。
- 规则从上往下执行,如匹配则停止,不再往下匹配。
-
修改主配置文件相对应目录,添加认证配置项
-
重启服务,访问测试
LNMP架构部署及应用
首先安装nginx和mysql,再安装php,此处就不演示安装过程了。
其中php的安装略有不同。
安装配置 PHP 解析环境
- 安装环境依赖包
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
- 编译安装
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
- 路径优化
ln -s /usr/local/php/bin/* /usr/local/bin/
ln -s /usr/local/php/sbin/* /usr/local/sbin/
- 调整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
- 启动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
- 配置 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
- 验证PHP 测试页
vim /usr/local/nginx/html/index.php
<?php
phpinfo();
?>
浏览器访问
http://192.168.44.30/index.php
- 验证数据库工作是否正常
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.44.30/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.44.30/bbs/install/index.php
数据库服务器:localhost ###本地架设就用localhost,如何不是在在本机上就要填写IP地址和端口号
数据库名字:bbs
数据库用户名:bbsuser
数据库密码:admin123
管理员账号:admin
管理员密码:admin123
访问论坛页面:
http://192.168.44.30/bbs/index.php
http://192.168.44.30/bbs/admin.php