Nginx网站服务
Nginx
概述
一款高性能、轻量级Web服务软件,稳定性高,系统资源消耗低。对HTTP并发连接的处理能力高(能够处理高并发),单台物理服务器可支持30000~50000个并发请求。
工作原理
Nginx 本身做的工作实际很少,当它接到一个 HTTP 请求时, 它仅仅是通过查找配置文件将此次请求映射到一个 location block,而此 location 中所配 置的各个指令则会启动不同的模块去完成工作,因此模块可以看做 Nginx 真正的劳动工作者。
通常一个 location 中的指令会涉及一个 handler 模块和多个 filter 模块(当然,多个 location 可以复用同一个模块)。handler 模块负责处理请求,完成响应内容的生成,而 filter 模块对响应内容进行处理。 用户根据自己的需要所开发的模块都属于第三方模块。正是有了这么多模块的支撑, Nginx 的功能才会如此强大。
模块
种类 | 包含 |
---|---|
核心模块 | HTTP 模块、EVENT 模块和 MAIL 模块 |
基础模块 | HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite 模块 |
第三方模块 | HTTP Upstream Request Hash 模块、Notice 模块和 HTTP Access Key 模 块 |
模块 | 功能 |
---|---|
Handlers(处理器模块) | 此类模块直接处理请求,并进行输出内容和修改 headers 信息等操作。Handlers 处理器模块一般只能有一个 |
Filters(过滤器模块) | 此类模块主要对其他处理器模块输出的内容进行修改操作,最后由 Nginx 输出 |
Proxies(代理类模块) | 此类模块是 Nginx 的 HTTP Upstream 之类的模块,这些模块主要与后端一些服务比如 FastCGI 等进行交互,实现服务代理和负载均衡等功能 |
安装nginx
将后续操作需要的压缩包一起拉到目录下。
systemctl stop firewalld
setenforce 0
yum -y install pcre-devel zlib-devel
#pcre-devel 是perl语言的正则表达式库,zlib-devel 软件包的开发包,一个函数库,库里面包括头文件,静态库甚至源码等资源
useradd -M -s /sbin/nologin nginx # 创建不可登录,不带宿主的用户nginx
tar zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
# --user=nginx --group=nginx:指定其运行时的账户与组 --with-http_stub_status_module:将状态模块启用
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #创链接
nginx -t #语法检查
nginx #启动
netstat -anpt | grep nginx #查看服务
PS:
killall -1 nginx #服务重启
killall -3 nginx #服务关闭
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 35 80 20 设置级别35,启动顺序80开启,关闭顺序20关闭
#description: Nginx HTTP Server
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$PROG #启动调用文件
;;
stop)
kill -s QUIT $(cat $PIDF) #服务退出,退出时加上进程文件号
;;
reload)
kill -s HUP $(cat $PIDF) #平滑过渡
;;
restart)
$0 stop 先关闭 $0: #表示当前执行的脚本或程序名称
$0 start 后开启
;;
*) #如果输入错误,提示可以支持的格式
echo "Usage: $0 {start|stop|reload|restart}"
exit 1 #退出代码
esac
exit 0 #退出脚本
chmod +x /etc/init.d/nginx
chkconfig --add nginx
chkconfig --list
ln -s /usr/local/nginx/conf/nginx.conf /etc/ #链接到/etc下,方便管理
vi /etc/nginx.conf
user nginx nginx #删除注释启用
worker_processes 4 #工作进程号改为4
error_log logs/error.log info; #删除注释启用
events {
use epoll; #支持高并发
worker_connections 4096; #修改并发连接数4096
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';#记录日志三个注释删除
charset utf-8 #修改成支持中文字符集utf-8
access_log logs/aa.com.access.log main; #删除注释,模块下启用访问日志功能改名aa.com
ulimit -n 65535 >> /etc/rc.local #修改资源数
nginx -t
开启统计模块
vi /etc/nginx.conf
location行下添加
location ~ /status { #匹配项只要URL路径中出现/status就会定位到该模块
stub_status on; #功能开启
access_log off; #不记录日志
}
systemctl stop nginx
systemctl start nginx
注意:开启统计模块时,配置文件不能用空格移动位置,要用Tab键,不然会404。
nginx status | 含义 |
---|---|
active connections | 活跃的连接数量 |
server accepts handled requests | 总共处理了n个连接,成功创建n次握手,总共处理了n个请求 |
reading | 读取客户端的连接数 |
writing | 响应数据到客户端的数量 |
waiting | 开启keep-alive的情况下,这个值等于active (reading+writing) 意思就是Nginx已经处理完正在等候下一次请求指令的驻留连接 |
查看日志文件
cd /usr/local/nginx/logs/
ll
cat aa.com.access.log | wc -l
配置验证功能
yum -y install httpd-tools #支持passwd命令
htpasswd -c /usr/local/nginx/passwd.db lb #lb为用户名
chown nginx /usr/local/nginx/passwd.db
nginx -t
systemctl stop nginx
systemctl start nginx
拒绝20.0.0.10访问
vi /etc/nginx.conf
添加 deny 20.0.0.1/32; #先拒绝
allow all; #后允许
systemctl stop nginx
systemctl start nginx
netstat -anpt | grep nginx
nginx不同于apache,验证管理是按照顺序进行执行的。
配置虚拟主机功能
删除之前验证功能配置
基于域名
vi /etc/nginx.conf #修改
server_name www.aa.com;
root /var/www/aa;
http模块中添加
server {
listen 80; #监听端口
server_name www.11.com; #主机名
charset utf-8; #字符集
access_log logs/11.com.access.log; #访问日志文件路径
location / { #站点目录
root /var/www/11; # 根
index index.html index.htm; #主页
}
error_page 500 502 503 504 /50x.html; #错误日志(出现500 502 503 504报错,引用50x.html文件)
location = /50x.html { #文件名
root html; #文件路径
}
}
mkdir -p /var/www/aa
mkdir -p /var/www/11
echo "<h1>this is aa.</h1>" > /var/www/aa/index.html
echo "<h1>this is 11.</h1>" > /var/www/11/index.html
vi /etc/hosts #添加
20.0.0.10 www.aa.com www.11.com
基于ip
ifconfig ens33:1 192.168.6.6/24
ifconfig
vi /etc/nginx.conf
nginx -t
systemctl stop nginx
systemctl start nginx
netstat -anpt | grep nginx
基于端口
vi /etc/nginx.conf #修改端口
其他和上面一样,检查语法错误,重启服务,查看服务起了没有,验证。
LNMP架构
安装mysql
tar zxvf mysql-boost-5.7.20.tar.gz
yum -y install ncurses ncurses-devel bison cmake #ncurses ncurses-devel:字符终端下屏幕控制的基本库,bison :自动生成语法分析器程序,cmake :跨平台的安装编译工具
useradd -s /sbin/nologin mysql #建立不可登录用户mysql
cd 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_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=1
make && make install #编译安装,时间长
chown -R mysql:mysql /usr/local/mysql/ #添加服务属主,属组
vi /etc/my.cnf #全删,重新添加
[client] #客户端
port = 3306 #访问端口
default-character-set = utf8 #默认字符设定
socket = /usr/local/mysql/mysql.sock #套接字路径,需与数据库套接字路径一致,否则无法访问
[mysql] #运行用户
port = 3306
default-character-set = utf8
socket = /usr/local/mysql/mysql.sock
[mysqld] #程序
user = mysql #运行用户
basedir = /usr/local/mysql #基本路径,根目录
datadir = /usr/local/mysql/data #用户目录
port = 3306 #运行端口
character_set_server = utf8 #服务器设定默认字符
socket = /usr/local/mysql/mysql.sock #运行时进程文件
pid-file = /usr/local/mysql/mysql.pid #套接字路径
server-id = 1 #每个数据库的id必须不一样
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
chown mysql:mysql /etc/my.cnf
echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile #复制环境变量到开机启动
echo 'export PATH' >> /etc/profile #设置全局变量
tail -5 /etc/profile #检查
source /etc/profile #立即执行变量
echo $PATH #检查环境变量
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data #初始化
cd /usr/local/mysql/
cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system #拷贝mysqld.service文件
systemctl daemon-reload #守护进程重新加载
systemctl start mysqld #开启服务
cd
netstat -anpt | grep 3306 #检查端口3306有没有开
systemctl enable mysqld #自启动
mysql #登录
mysql> set password for root@localhost = password('123123'); #设密码
mysql> exit #退出
mysql -uroot -p123123 带密码登陆
mysql> #成功登陆
注:要进到/usr/local/mysql/目录下才能拷贝。
安装配置php
tar jxvf php-7.1.10.tar.bz2
yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel curl curl-devel openssl openssl-devel #libjpeg libjpeg-devel :jpeg图像压缩库,libpng libpng-devel :png图像压缩库,freetype freetype-devel :字体引擎,libxml2 libxml2-devel :解析Xml程序库,zlib zlib-devel :数据压缩,curl curl-devel :传输工具,openssl openssl-devel :安全通信
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-gb --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
cp php.ini-development /usr/local/php/lib/php.ini #拷贝扩展配置文件到php库文件下,重命名php.ini
vi /usr/local/php/lib/php.ini #编辑配置文件,修改
date.timezone = Asia/Shanghai #去掉注释,添加时区为上海,939行
mysqli.default_socket = /usr/local/mysql/mysql.sock #添加套接字mysql路径,1170行
/usr/local/php/bin/php -m | wc -l
配置及优化FPM模块
cd /usr/local/php/etc
cp php-fpm.conf.default php-fpm.conf
cd /usr/local/php/etc/php-fpm.d/
cp www.conf.default www.conf
cd /usr/local/php/etc/
vi php-fpm.conf
pid = run/php-fpm.pid #去掉注释
/usr/local/php/sbin/php-fpm -c /usr/local/php/lib/php.ini
netstat -anpt | grep 9000
ln -s /usr/local/php/bin/* /usr/bin #让/usr/local/php/bin/下生成的所有命令都链接到/usr/bin下
让nginx支持PHP功能
vi /etc/nginx.conf
修改$document_root (调用变量)
一大段的注释都要去掉
nginx -t
systemctl stop nginx
systemctl start nginx
vi /usr/local/nginx/html/index.php
<?php
phpinfo();
?>
浏览器上访问
测试数据库工作
mysql -uroot -p123123 #登录
mysql> create database bbs; #创建数据库
mysql> grant all privileges on bbs.* to 'bbsuser'@'localhost' identified by 'admin123'; #本地授权
mysql> grant all privileges on bbs.* to 'bbsuser'@'%' identified by 'admin123'; #远程授权
mysql> flush privileges; #刷新
mysql> exit
vi /usr/local/nginx/html/index.php
<?php #变量 连接信息 本机地址 数据库登录名 登录密码
$link=mysqli_connect ('20.0.0.11','bbsuser','admin123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
?>
部署Discuz 社区论坛
unzip Discuz_X3.4_SC_UTF8.zip
cd dir_SC_UTF8/
cp -r upload/ /usr/local/nginx/html/bbs
cd /usr/local/nginx/html/bbs/
chown -R root.nginx ./config/
chown -R root.nginx ./data/
chown -R root.nginx ./uc_client/
chown -R root.nginx ./uc_server/
chmod -R 777 ./config/
chmod -R 777 ./data/
chmod -R 777 ./uc_client/
chmod -R 777 ./uc_server/
访问http://20.0.0.10/bbs/install/index.php
安装完成,访问http://20.0.0.10/bbs/index.php
设置安装目录仅自己可见
ll
mv install/ install.lock
chmod 600 install.lock/