Nginx

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx相关的知识,希望对你有一定的参考价值。

nginx

模块化设计
(开源软件)继承性

Apache [老 功能多 性能差] 并发量 2-3w
Nginx [快 性能] 5w
Lighttpd
以上均不做JAVA网站

Tomcat
IBM WebSphere
Jboss
做JAVA网站

安装 基于tar包

useradd -s /sbin/nologin nginx(可做可不做)
解包编译
cd nginx-1.8
--prefix=/usr/local/nginx #指定安装位置
./configure --user=nginx[默认安装若干个模块]
./configure --with-模块名称 --with-模块 #安装默认模块之外的模块
./configure --with-http_ssl_module #做加密网站须安装模块
make
make install
默认用户nobody
root启动nginx[nginx普通用户]

useradd 为了安全

实验1 升级

nginx-1.8---->1.9

nginx-1.8 少模块---->1.9 多模块
[[email protected] ~]# cd lnmp_soft/
[[email protected] lnmp_soft]# rm -rf nginx-1.8.0
[[email protected] lnmp_soft]# tar -xf nginx-1.9.0.tar.gz
[[email protected] lnmp_soft]# cd nginx-1.9.0/
[[email protected] nginx-1.8.0]# ./configure --with-http_ssl_module
#配置安装方式
[[email protected] nginx-1.8.0]# make #根据选择的功能 把源码变成二进制程序
[[email protected] nginx-1.8.0]# cp objs/nginx /usr/local/nginx/sbin/
#升级一般不使用make install make install 可能会将原有的覆盖 只cp程序即可
[[email protected] ~]# nginx #启动nginx服务
[[email protected] ~]# nginx -s stop #停止nginx服务
[[email protected] ~]# nginx -V #查看信息

实验2 虚拟主机

1 基于域名的虚拟主机
客户端/etc/hosts #本地域名解析文件
IP 域名
IP 域名
优先级高于DNS

server {
listen 80;
server_name www.b.com;

location / {
    root   web;
    index  index.html index.htm;
}

}
#找模版,去注释
#改端口
#改域名
#修改网站的根目录

测试
客户端 修改/etc/hosts
192.168.4.5 www.b.com

firefox http://www.a.com

2 基于端口的虚拟主机
listen 8909
3 基于IP的虚拟主机
<virtualhost 192.168.4.5:80>
<virtualhost 192.168.2.5:80>

实验3 https
http协议是明文[软件]
http+ssl
加密算法

对称加密 #加密和解密是同一把钥匙 [单机加密]
非对称加密 #加密和解密不是同一把钥匙
哈希值 #数据安全 md5sum 加文件

生成秘钥文件
[[email protected] web]# cd /usr/local/nginx/conf/
[[email protected] conf]# openssl genrsa > cert.key #生成私钥 解密
[[email protected] conf]# openssl req -new -x509 -key cert.key > cert.pem

国家CN 省份 城市 公司 部门 主机名 邮箱
#生成证书(公钥) 加密
#除国家必须为CN外 均不限制内容
修改配置 调用秘钥
[[email protected] conf]# vim /usr/local/nginx/conf/nginx.conf
ssl_certificate cert.pem; #公钥
ssl_certificate_key cert.key; #私钥
[[email protected] ~]# nginx -s reload

验证
[[email protected] ~]# firefox https://www.c.com/

实验4 代理(调度器)

实现负载均衡
健康检查功能(web高可用)

1 部署后台2个web服务器
装包 写入测试页面 起服务 防火墙
2 部署Proxy 调度器
[[email protected] conf]# cp nginx.conf.default nginx.conf
cp:是否覆盖"nginx.conf"? y
使用原始配置 覆盖nginx.conf 还原nginx的配置 覆盖之前环境

定义集群 #增加吞吐量 增加并发量
[[email protected] conf]# vim nginx.conf
http {
..
upstream webs {
server 192.168.2.100:80;
server 192.168.2.200:80;
}
..
server {
#在默认的http下面 server 上面 定义一个集群 "webs" 集群名 不做限制
#只是定义 没有使用集群

调用集群
location / {
proxy_pass http://webs;
root html;
index index.html index.htm;
}
在root html;前面添加一句 将访问请求 转发给webs
[[email protected] conf]# nginx

upstream webs {
ip_hash;
server 192.168.2.100:80 max_fails=1 fail_timeout=20;
server 192.168.2.200:80 weight=2;
}
#weight 权重 默认为1 权重越高 负载的请求量越多
#max_fails 如果链接失败 再尝试n次 诊断为服务器故障
#fail_timeout 诊断为故障服务器之后 一定时间内 不再链接该服务器
#down 服务器故障之后 标记该服务器 直到人为解除 不再链接该服务器
#ip_hash 相同客户端访问相同的服务器 nginx调度器默认的算法是轮询

]# nginx -s reload #在不关闭服务的情况下 重载服务
]# tailf /usr/local/nginx/logs/error.log
#报错日志文件

实验4 动态web

静态页面 请求一个页面 服务器直接返回一个页面
动态页面 请求一个页面 服务器执行代码 返回一个页面

Nginx 动态web
LNMP
装包 7个包
安装Nginx 源码包
yum装 mariadb mariadb-server mariadb-devel php php-mysql
rpm包 php-fpm #php服务 随时在线解释代码

[[email protected] conf]# yum -y install mariadb mariadb-server mariadb-devel php php-mysql
[[email protected] lnmp_soft]# rpm -ivh php-fpm-5.4.16-36.el7_1.x86_64.rpm

起服务
[[email protected] lnmp_soft]# systemctl restart mariadb
[[email protected] lnmp_soft]# systemctl restart php-fpm.service

检查监听端口
[[email protected] lnmp_soft]# netstat -nlpt | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0: LISTEN 4369/nginx: master
[[email protected] lnmp_soft]# netstat -nlpt | grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:
LISTEN 9427/mysqld
[[email protected] lnmp_soft]# netstat -nlpt | grep 9000
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 9509/php-fpm: maste

Nginx的动静分离
location #匹配用户的地址栏
#可以写正则表达式 ~/正则/
#其他无匹配时 均匹配/

location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
当用户访问php页面时 执行
1 找页面的位置 (test.php)
2 把找到的页面交给9000端口(PHP)

写入php测试页面
[[email protected] html]# cat test.php
<?php
$i=1;
echo $i;
?>

重起Nginx
客户端验证

[[email protected] ~]# curl http://192.168.4.5/test.php

如果出现错误 查看日志
tailf /usr/local/nginx/logs/error.log
tailf /var/log/php-fpm/error.log

Nginx地址重写

把地址栏重新改写
原来有a.html 后来删除 不做任何处理 访问结果无页面
缩短地址栏的长度

rewrite 旧域名(支持正则) 新域名 [选项]
1 访问a.html跳转到b.html
location / {
root html;
rewrite /a.html /b.html;
index index.html index.htm;
}
[[email protected] html]# echo web test b > b.html

验证 firefox http://192.168.4.5/a.html

rewrite /a.html /b.html redirect;
redirect #可选项 访问a时 浏览器的地址栏变成b
验证 firefox http://192.168.4.5/a.html

rewrite /c.html /movie/test/c.html
#缩短地址栏的长度

2 访问192.168.4.5跳转到www.tmooc.cn
server {
listen 80;
server_name localhost;
rewrite ^/ http://www.tmooc.cn;
location / {
root html;
#rewrite 写到location的外面

3 访问192.168.4.5跳转到www.tmooc.cn对应的子目录
server {
listen 80;
server_name localhost;
rewrite ^/(.*) http://www.tmooc.cn/$1;
location / {
root html;

4 根据终端类型 展示不同的页面
#手机展示窄屏页面 电脑展示宽屏页面
#根据不同的浏览器 提供不同的页面

准备两个测试页面
[[email protected] ~]# cd /usr/local/nginx/html/
[[email protected] html]# echo "Firefox test web" > test.html
[[email protected] html]# mkdir curl
[[email protected] curl]# echo "Curl test web" > curl/test.html

修改配置文件
[[email protected] nginx]# cd /usr/local/nginx/conf/
[[email protected] conf]# vim nginx.conf
#写在server内 location外
if ($http_user_agent ~ curl){
rewrite ^/(.
) /curl/$1;
}
#*不区分大小写
如果在"Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0"
做正则匹配

验证
[[email protected] ~]# Firefox http://192.168.4.5/test.html
Firefox test web

[[email protected] ~]# curl http://192.168.4.5/test.html
Curl test web

[[email protected] ~]# curl -A firefox http://192.168.4.5/test.html
Firefox test web

浏览器标示 [人--地址栏] user_agent
浏览器 把自己的各种信息都给了服务器
浏览器支持伪装
设置 浏览器UA标示
[[email protected] ~]# curl -A "Linux 7 IE 8.0" http://192.168.4.5/test.html
#客户端伪装
[[email protected] conf]# tailf /usr/local/nginx/logs/access.log
#服务端查看访问日志
192.168.4.100 - - [07/Jan/2018:22:01:27 -0500] "GET /test.html HTTP/1.1" 200 17 "-" "Linux 7 IE 8.0"

语法格式
rewrite 旧地址 新地址 [选项];
旧地址支持正则
选项可加可不加

选项
last #不再读其他rewrite
break #不再读其他语句 包括rewrite 以及location
redrict #访问a地址栏自动变成b(临时重定向)
permanent #让地址栏变化 访问a 地址栏自动变成b(永久重定向)

Nginx 性能优化

显示版本号 不安全 漏洞

]# curl -I http://192.168.4.5/test.html
HTTP/1.1 200 OK
Server: nginx/1.8.0 #显示具体版本号
Date: Mon, 08 Jan 2018 03:47:48 GMT
Content-Type: text/html
Content-Length: 14
Last-Modified: Mon, 08 Jan 2018 02:20:07 GMT
Connection: keep-alive
ETag: "5a52d557-e"
Accept-Ranges: bytes

关闭默认版本号的显示
[[email protected] conf]# vim nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; #添加

验证
[[email protected] ~]# curl -I http://192.168.4.5/test.html
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 08 Jan 2018 03:51:06 GMT
Content-Type: text/html
Content-Length: 14
Last-Modified: Mon, 08 Jan 2018 02:20:07 GMT
Connection: keep-alive
ETag: "5a52d557-e"
Accept-Ranges: bytes

并发量
包 httpd-tools
ab -c 500 -n 500

[[email protected] ~]# ab -c 500 -n 500 http://192.168.4.5/
[[email protected] ~]# ab -c 1025 -n 1025 http://192.168.4.5/

Nginx配置文件
[[email protected] conf]# vim nginx.conf
worker_processes 1;
events {
worker_connections 65535; #每一个worker的并发量
}
#进程数要与cpu的内核数量一致
#并发量 等于进程数乘以每一个worker的并发量

Linux系统内核(文件 进程 用户数量)
[[email protected] conf]# ulimit -a
[[email protected] conf]# ulimit -Hn 100000 #-H硬限制(用户不可修改) n(最大文件数量)
[[email protected] conf]# ulimit -Sn 100000 #-S软限制(用户可以修改) n(最大文件数量)
[[email protected] conf]# ulimit -a
#并发量高的服务 以上两值均需修改
#当前立刻有效 重启计算机后无效
vim /etc/security/limits.conf
#修改配置文件后 永久生效
* soft nofile 100000
* hard nofile 100000
#默认值是1024

客户端访问头部信息过长
使用脚本测试长头部请求是否能获得响应
[[email protected] lnmp_soft]# cat 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

<center><h1>414 Request-URI Too Large</h1></center> #提示头部信息过大

[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
client_header_buffer_size 1k; #默认请求包头信息的缓存
large_client_header_buffers 4 4k; #大请求包头部信息的缓存个数与容量

Nginx压缩 速度 流量
[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
gzip on; #开启压缩功能 所有浏览器都支持gzip解压
gzip_min_length 1000; #小文件不压缩 至少1000个字节的文件才压缩
gzip_comp_level 4; #压缩比率(1-9)
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
#对什么格式的文件进行压缩

#mp4 mp3 jpg 不进行压缩 因为已经是压缩格式了 多媒体文件一般是压缩格式
#一般对文档进行压缩 doc html css php pdf xls
#需要压缩什么格式的文件 参考 /usr/local/nginx/conf/mime.types 文件
application/msword doc;

让用户的浏览器 缓存数据
缓存不会变化的数据
仅对多媒体文件要求用户缓存30天
配置文件
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80
server_name localhost;
location / {
root html;
}
location ~.(jpg|png|gif)${
expires 30d;
}

拷贝图片
[[email protected] html]# mv dottexture_navy_2560x1440.jpg abc.jpg

验证
Firefox http://192.168.4.5/abc.jpg
Firefox about:cache
http://192.168.4.5/abc.jpg 659666 bytes 2 2018-01-08 04:05:06 2018-02-07 04:05:06

自定义页面报错
200 一切正常
300 页面被重定向
400 页面异常(用户端错误)
500 服务端错误(服务端错误)
[[email protected] conf]# vim nginx.conf
charset utf-8;
error_page 404 /404.html;

以上是关于Nginx的主要内容,如果未能解决你的问题,请参考以下文章

将 nginx rtmp 片段发送到 WebRTC

text 有用的nginx命令和片段

linux学习:Nginx--常见功能配置片段与优化-06

HLS NGINX-RTMP [错误] 1281#0:* 58 hls:强制片段拆分:10.002 秒

Nginx 跨域

Nginx配置文件详细介绍