Nginx
一、源码包安装
1、原理
- 源代码:即人写的代码,由各种语言形成,如shell、Python、JAVA、C语言等等。
- 编译:用专门的编译器翻译成计算机语言(二进制)
- 安装:将生成的计算机语言(二进制)放在指定路径中。
例:shell 脚本 ------------> bash 解释器(即:编译)-----------> 运行
2、特点
-
可自定义安装路径
-
自定义安装模块
- ./configure -help #可以查看模块
- 模块中–with-:可选择安装模块,默认不安装;–without-:为默认安装模块,如不需要则写上
3、正式安装
- 首先安装依赖包pcre-devel、openssl-devel
- pcre-devel:让Nginx支持正则; openssl-devel:让Nginx做加密网站
- 同时为了安全。需要创建一个无法登录的用户,用于启动Nginx
- 原因:如不指定用户启动,默认是以root启动(程度会继承root权限)
- 其中涉及权限。参考附加权限set-uid,这个原理相当于该权限的反应用。
[root@proxy ~]# yum -y install gcc pcre-devel openssl-devel //安装依赖包
[root@proxy ~]# useradd -s /sbin/nologin nginx
[root@proxy nginx-1.10.3]# ./configure \
> --prefix=/usr/local/nginx \ //指定安装路径
> --user=nginx \ //指定用户
> --group=nginx \ //指定组
> --with-http_ssl_module //开启SSL加密功能
[root@proxy nginx-1.10.3]# make && make install //编译并安装
nginx在源码安装时,如果不指定用户,程序本身会强制自动降级成nobody用户,nobody是Linux默认用户。
4、nginx基础命令
- nginx之所以比Apache牛逼:是因为底层支持事件型模型,内核支持事件型触发
[root@proxy ~]# /usr/local/nginx/sbin/nginx //启动服务
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s stop //关闭服务
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload //重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx -V //查看软件信息
[root@proxy ~]# ln -s /usr/local/nginx/sbin/nginx /sbin/ //创建快捷方式,并放入PATH中,方便后期可直接使用nginx命令
5、netstat、ss 命令
- 该命令可以查看系统中已启动的商品信息。
~]# netstat -atunpl | grep nginx
-a:显示所有端口的信息
-n:以数字格式显示端口号
-t:显示TCP连接的端口
-u:显示UDP连接的端口
-l:显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p:显示监听端口的服务名称是什么(也就是程序名称)
~]# ss -atunpl | grep nginx //显示信息更加详细。
6、版本平滑升级
操作步骤:
- 解包,编译
- ./configure #此功能是把在source目录中默认常用的源码包模块选出来,再加上用户自定义安装的模块,放入新生成的目录objs中。
- make #编译会生成一个可运行的主程度。就是将目录objs中的源码进行编译。
- 注意,到make就可以了,无需再make install安装。
- 编译后在原目录下会生成一个新目录objs,里面有新的主程序nginx
- 备份老的主程序
- 将新的主程序移动到安装目录下
- 杀死旧进度,再启动nginx。命令:make upgrade
[root@proxy ~]# tar -xf nginx-1.12.2.tar.gz
[root@proxy ~]# cd nginx-1.12.2
[root@proxy nginx-1.12.2]# ./configure \
--prefix=/usr/local/nginx \ # 指定安装路径
--user=nginx \ # 指定用户
--group=nginx \ # 指定组
--with-http_ssl_module # 开启SSL加密功能
[root@proxy nginx-1.12.2]# make
[root@proxy ~]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
[root@proxy ~]# cp objs/nginx /usr/local/nginx/sbin/
[root@proxy ~]# make upgrade
或者:
]# killall nginx
]# /usr/local/nginx/sbin/nginx
二、设置用户访问时密码认证
1、修改配置文件
`在server{}中添加
server {
auth_basic "input password:"; # 显示的提示信息
auth_basic_user_file "/usr/local/nginx/pass"; # 指定密码文件
}
2、生成密码文件
- 需要安装软件:httpd_tools。命令:htpasswd -c
[root@proxy ~]# yum -y install httpd-tools
[root@proxy ~]# htpasswd -c /usr/local/nginx/pass tom //创建密码文件
#注意:-c :create创建。追加不使用此选项
[root@proxy ~]# htpasswd /usr/local/nginx/pass jerry //追加用户,不能再用-c选项
三、设置https加密网站
1、生成私钥与证书
- 前提:需要安装依赖软件:openssl-devel
[root@proxy ~]# cd /usr/local/nginx/conf
[root@proxy ~]# openssl genrsa > cert.key # 生成私钥
[root@proxy ~]# openssl req -new -x509 -key cert.key > cert.pem # 生成证书
# -new 新建 -x509 证书格式
2、修改nginx配置,调用证书
- 注意:在源码安装时需要添加模块:–with-http_ssl_module
- 配置文件中本身已经有相关模板,只需要把注释打开即可。
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
… …
server {
listen 443 ssl;
server_name www.c.com;
ssl_certificate cert.pem; # 这里是证书文件
ssl_certificate_key cert.key; # 这里是私钥文件
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
四、设置虚拟主机
原理
- 一个server{} 就是一个虚拟主机。
- 在配置文件中添加 server{} 框架即可。
# 格式框架。必须在http{}中。
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
http {
server {
listen 端口;
server_name 域名;
location / {
root 网页根目录; # 只填写相对路径即可。
index index.html index.php; # 默认首页,匹配即止。
}
}
}
五、地址重写
1、格式
- rewrite 旧地址 新地址 [选项];
- last:不再读其他rewrite(类似于shell循环中的continue)
- break 不再读其他语句,结束请求
- redirect: 临时重定向(实际效果是:用户输入A,会显示成B)
- permament:永久重定向
2、正则的使用
http{
server {
listen 80;
server_name www.a.com;
rewrite ^/(.*) http://www.tmooc.cn/$1; # 这里的()是:保留,$1则是调用保留。
# 在server_name中已经标明了域名,在rewrite中旧地址中就可以省略前面的域名,只写后面的地址文件,或者用正则表示的文件。如:rewrite a.html b.html;rewrite ^/a b.html;
location / {
rewrite ^/ http://www.tmocc.cn/; # 跳转到首页。
}
}
}
# 在实际使用中,rewrite可以放在location{}里面,也可以在外面,但是都要在server{}里面。根据实际使用对象、场景进行设置。
3、实际案例
'在生活中,手机与电脑浏览同一个网站,同一个域名,但是需要调用的页面不一致。'
http {
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html
}
if ($http_user_agent ~* firefox) {
rewrite ^(.*)$ /firefox/$i;
}
}
}
# $http_user_agent 这是Nginx的一个内置变量,存储的信息是:客户端的操作系统和浏览器信息
# IE浏览器:$http_user_agent=msie; 火狐:$http_user_agent=Firefox
六、"动静"分离
1、原理
- 一个location / {} 就是匹配一个或一类页面
- 在Nginx配置文件中。server_name是用来匹配域名的。location是用来匹配域名后面的地址栏的。
- 可以将location理解成:如果
2、正则的使用
- 在使用正则时,需要在正则前加:~
location ~ /.* {xxxx}
location ~ /a.* {xxxx}
location ~ ^/abc$ {xxx} = location ~ ^abc$ {xxx}
# location是用来匹配域名后面的。所以在正则应用中/是可以不写的。
location / {} # 这个比较特殊。是匹配一切,但优先级最低。可放在任意位置,与位置无关。
3、动静分离
server {
listen 80;
server_name www.a.com;
location / { # "静"
root html;
index index.html;
}
location ~ /.php$ { # "动"。所有匹配以.php结尾的请求则按此执行。
root html;
fastccgi_pass 127.0.0.1:9000; # 转发给本机9000端口:php解释器
fastcgi_index index.php;
include fastcgi.conf; # 调用其它配置文件
}
}
4、扩展
-
FastCGI:快速通用网关接口。多进程模式。Nginx结合FastCGI技术即可支持PHP页面架构
-
查看日志小技巧:
- tailf error.log:此命令打开的日志为动态日志。打开后按ENTER清空,然后再操作,则可显示实时的信息。
-
LNMP中的mysql是由PHP脚本连接mysql,一般由PHP开发人员负责写入脚本中,无需要运维人员写相应的脚本。
-
mysql -e [mysql的命令]:非交互式操作
七、Nginx的优化
1、自定义报错页面
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
charset utf-8; # 仅需要中文时需要改选项,可选项
error_page 404 /404.html; # 自定义错误页面
.. ..
知识扩展
-
utf-8:万国编码:是由苹果、IBM等几大公司联合,统一编码,包含全球主流语种。
-
编码:将人类的语言与计算机语言(二进制)进行对应的码表。
-
刚开始,只有一个ASCII码表,0~127(英文字母加常用符号)
-
进入中国后,将中文进行编码:GB2312(国标2312)
常见HTTP状态码
状态码 | 功能描述 |
---|---|
200 | 一切正常 |
301 | 永久重定向 |
302 | 临时重定向 |
401 | 用户名或密码错误 |
403 | 禁止访问(客户端 IP 地址被拒绝) |
404 | 文件不存在 |
414 | 请求 URL 头部过长 |
500 | 服务器内部错误 |
502 | Bad Gateway |
2、查看服务器状态
2.1、原理
单独创建一个:location / {},进行指向一个单独的,由管理员才能登录的网页进行查看。
-
背景:实际工作中经常需要关注重要参数:并发量,总访问量,等待人数。
-
专门的模块:stub_status;在源码包安装时加装:–with-http_stub_status_module
[root@proxy ~]# cat /usr/local/nginx/conf/nginx.conf
… …
location /status { # status只是一个访问名称,自定义
stub_status on;
#allow IP地址;
#deny IP地址;
}
… …
2.2、页面详情
[root@proxy ~]# firefox http://192.168.4.5/status
Active connections: 1 # 实时并发量
server accepts handled requests
10 10 3
Reading: 0 Writing: 1 Waiting: 0
-------------------------------------------------------------------------------
Active connections:当前活动的连接数量。
Accepts:已经接受客户端的连接总数量。
Handled:已经处理客户端的连接总数量。
(一般与accepts一致,除非服务器限制了连接数量)
Requests:客户端发送的请求数量.
Reading:当前服务器正在读取客户端请求头的数量。
Writing:当前服务器正在写响应信息的数量。
Waiting:当前多少客户端在等待服务器的响应。
2.3、扩展
[root@proxy ~]# yum -y install http-tools # 模拟并发量工具
[root@proxy ~]# ab -c 100 -n 100 http://192.168.4.5/
# -c:模拟人数;-n:总访问次数。 注意:http最后一定要以/结尾
3、优化并发量
3.1、修改nginx配置
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
worker_processes 2; # 与CPU核心数量一致
events {
worker_connections 65535; # 每个worker最大并发连接数
}
.. ..
-------------------------------------------------------------------------
worker_processes:nginx启动时的进程数,不能随便写,最多与CPU内核一致(用lscpu可查)
worker_connections:连接数,也是并发量。可大不可小。
# 了解:nginx实验室理论值最大并发量约5万。 65536:linux中最大的端口号。
3.2、修改Linux内核
-
Linux内核参数中。默认同时打开文件数为1024。
-
因为客户访问nginx打开页面,就是打开对应的网页文件。
[root@proxy ~]# ulimit -a //查看全部的内核参数。
......
open files (-n) 1024 # 可打开的文件数。(-n)就是修改时要用的选项
.. ..
.. ..
------------------------------------------------------------------
[root@proxy ~]# ulimit -Hn 100000 //H:硬限制,不能超过
[root@proxy ~]# ulimit -Sn 100000 //S:软限制,可打破
#以上为临时设置,可立刻生效。在实际生产中,因为不能随意停机,应这样设置,但还需要设置永久配置。
--------------------------------------------------------------------
[root@proxy ~]# vim /etc/security/limits.conf
.. .. ..
* soft nofile 100000
* hard nofile 100000
限制目标 软、硬 限制的项目(固定格式) 限制值
nofile=number of file
4、优化URL
4.1、增加URL缓存
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
client_header_buffer_size 1k; # 默认请求包头信息的缓存
large_client_header_buffers 4 4k; # 大请求包头部信息的缓存个数与容量:4个4K
.. ..
}
# 案例中的设置在以后的工作环境中是足够的。在实验时,由于脚本产生的URL过大,可以设置稍大些。
4.2、测试脚本
[root@proxy ~]# cat lnmp_soft/buffer.sh
#!/bin/bash
URL=http://192.168.4.5/index.html?
for i in {1..5000}
do
URL=${URL}v$i=$i
done
curl $URL # 经过5000次循环后,生成一个长的URL地址栏
5、优化浏览器缓存
- 浏览器缓存:只缓存静态页面。因动态页面是脚本,如缓存会出错。
- 虽然缓存是放在用户本地浏览器上的。但是缓存什么、缓存多久,是由服务器决定的。
- 缓存时间:一般按公司资料的变更周期决定。
- 原理:单独定义一个location / {}
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { # 定义缓存哪些页面
expires 30d; # 定义客户端缓存时间为30天
}
}
6、优化服务器缓存
- 原因:如果需要处理大量静态文件,可将文件缓存在内存中,提高读取速度。
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
http {
open_file_cache max=2000 inactive=20s; # 最大缓存文件,关闭超时无访问
open_file_cache_valid 60s; # 缓存文件的有效时间。超过即清除
open_file_cache_min_uses 5; # 访问次数超过5次才被缓存
open_file_cache_errors off; # 缓存报错不要写日志
}
# 因为缓存是短时间性的。当有客户端访问时,无法访问到缓存数据就会报错,所以会有大量常规性报错,可无需理会。
7、对页面压缩
-
开启压缩好处:省流量,速度更快。
-
注意:一般只压缩文档类型的。不压缩多媒体文件(因为都比较大:如高清照片、电影等)
-
所有的浏览器都是解压软件,都支持 gzip 解压
-
压缩比率:0~9。==数字越小,速度越快,效果越差。==一般选中间的。
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
http {
.. ..
gzip on; # 开启压缩
gzip_min_length 1000; # 小文件不压缩
gzip_comp_level 4; # 压缩比率
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# 对特定文件压缩,注意:这里的类型不能直接写txt,jpg等,需要参考mime.types
.. ..
}
[root@proxy ~]# cat /usr/local/nginx/conf/mine.types
8、日志切割
8.1、旧日志重命名
[root@proxy ~]# cd /usr/local/nginx/logs/
[root@proxy logs]# mv access.log access-20190909.log
8.2、生成新日志
[root@proxy ~]# ls /usr/local/nginx/logs/
access.log error.log nginx.pid
[root@proxy logs]# kill -USR1 $(cat nginx.pid) # 这里不是杀死进程,是生成新日志。
# 当nginx启动时,会生成一个nginx.pid的文件,里面存储的就是此时的进程号。
8.3、脚本+计划任务
[root@proxy ~]# vim /usr/local/nginx/logbak.sh
#!/bin/bash
date=`date +%Y%m%d`
logpath=/usr/local/nginx/logs
mv $logpath/access.log $logpath/access-$date.log
mv $logpath/error.log $logpath/error-$date.log
kill -USR1 $(cat $logpath/nginx.pid)
[root@proxy ~]# crontab -e
03 03 * * 5 /usr/local/nginx/logbak.sh