什么是nginx
nginx 是一个开源且高性能, 可靠的Http web服务, 代理服务, 负载均衡
开源: 直接获取源代码
高性能: 高并发
可靠: 服务稳定
轻量: 占用资源少
常见的HTTP Web服务
httpd 由apache基金会
IIS 微软服务器版
GWS google开发
Openrestry 基于nginx + lua
Tengline 淘宝基于nginx开发
市场占有率: apache>IIS>nginx
nginx 在互联网行业使用比较广泛
为什么选择nginx
Nginx非常轻量
功能模块少(源代码仅保留http与核心模块代码, 其余不够核心代码会作为插件来安装)
代码模块化 (易读, 便于二次开发, 对于开发人员非常友好)
server {
location /nba {
}
location /cba {
}
}
server {
location /lxx {
}
location /lyy {
}
}
nginx 适合做微服务, 云架构, 中间层
nginx 采用Epool网络模型, apache 采用select模型
- select
- 当用户发起一次请求, 会存入FD(文件描述符),
- select模型每次调用就会进行一次遍历扫描FD文件描述符,默认值是1024/2048,
- 如果修改这个值, 会影响整体性能, 使得很多连接超时,
- 数据由内核拷贝到用户态
- Epool
- Epoll 没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048, 一般来说这个数目和系统内存关系很大
- Epoll 不仅会告诉应用程序有I/0 事件到来,还会告诉应用程序相关的信息,这些信息是应用程序填充的,因此根据这些信息应用程序就能直接定位到事件,而不必遍历整个FD 集合
nignx 应用场景
静态服务
- 浏览器缓存
- 防资源调用(反爬)
- 资源分类
- 资源压缩
- 资源缓存
- 跨域访问
代理服务
代理的优点就是可以缓存,流程为PC把请求发送给代理服务器, 代理服务器访问到了服务器, 缓存下来, 再提供给PC, 当PC下次再访问, 则更快
代理服务器可以限制访问页面大小(缓存大小), 屏蔽敏感词汇
- 正向代理(客户端代理)
"代理服务器"代理了"客户端",去和"目标服务器"进行交互, 隐藏客户端的IP, web服务器上只能看到代理服务器的IP
- 反向代理(服务器代理)
外访内,是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器
使用场景就是负载均衡, 当受到攻击时候, 暴露的IP是负载均衡的IP, web服务器不会受影响
- 代理缓存
- 动静分离
安全服务
- 访问控制
基于身份认证的
- WAF (防攻击, DDOS, CC, SQL注入)
- 流量限制
- 拦截攻击
- 拦截异常请求
- 拦截SQL注入
流行架构
- Nginx + PHP(Fastcgi_pass)LNMP
- Nginx + Jave(Proxy_Pass)LNMT
- Nginx + Python (uwsgi_pass)
nginx安装
http://nginx.org/en/linux_packages.html#RHEL-CentOS
- 配置yum仓库
$ yum install yum-utils
$ vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
$ yum install nginx -y
$ nginx -v
nginx version: nginx/1.16.1
nginx配置
查看nginx的文件
$ rpm -ql nginx
nginx 主配置文件
/etc/nginx
/etc/nginx/nginx.conf
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
cgi, Fastcgi, uwsgi配置文件
/etc/nginx/uwsgi_params
/etc/nginx/scgi_params
/etc/nginx/fastcgi_params
nginx编码转换映射文件
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/win-utf
http协议的Content-Type 与扩展名
/etc/nginx/mime.types
配置文件守护进程管理器
/usr/lib/systemd/system/nginx.service
-----> systemctl reload nginx
nginx日志轮询, 日志切割
/etc/logrotate.d/nginx
nginx终端管理命令
/usr/sbin/nginx
-----> nginx -s reload
/usr/sbin/nginx-debug
/usr/lib64/nginx
/usr/lib64/nginx/modules
nginx默认站点目录
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
nginx的帮助手册
/usr/share/doc/nginx-1.16.1
/usr/share/doc/nginx-1.16.1/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
nginx的缓存目录
/var/cache/nginx
nginx的日志记录
/var/log/nginx
查看nginx安装的选项
$ nginx -V 2>&1 |grep 'prefix'|cut -d: -f2
--prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
编译选项
- 程序安装目录和路径
--prefix=/etc/nginx
--sbin-path=/usr/sbin/nginx
--modules-path=/usr/lib64/nginx/modules
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock
- 临时缓存文件
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
- 设定nginx进程启动用户和组(安全)
--user=nginx
--group=nginx
- 设置额外的参数将被添加到CFLAGS变量
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC'
- 设置附加的参数, 链接系统库
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
场景
- 如果之前的nignx通过源码安装, 这个时候部署新的nginx服务器, 如何部署
通过 nginx -v 获得版本
通过nginx -V 获得configure选项
nginx配置文件
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
coreModule
核心模块, 全局配置, 可以有events, http
user nginx; # nginx进程所使用的用户
worker_processes 1; # nginx运行的work进程数量(建议和CPU数量一直或auto)
error_log /var/log/nginx/error.log warn; # nginx错误日志存放路径
pid /var/run/nginx.pid; # nginx服务运行后产生的pid进程号
EventModule
事件驱动模块
events {
worker_connections 1024; # 每个worker进程支持的最大连接数
use epool; # 事件驱动模型, epoll默认
}
HttpCoreModule Http
内核模块
http模块曾允许有多个server曾, server主要用于配置多个网站
server层允许多个Location, Location主要用于定义网站访问路径
http {
include /etc/nginx/mime.types; # html渲染所支持的样式
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 /var/log/nginx/access.log main;
sendfile on; # 是否能发送文件
#tcp_nopush on;
keepalive_timeout 65; # 长连接超时时间65s
#gzip on; # 是否压缩
include /etc/nginx/conf.d/*.conf; # 模块导入路径
# 使用server模块来配置网站, 每个server{} 代表一个网站(简称虚拟主机)
server {
listen 80; #监听端口
server_name: localhost; # 提供服务器的域名或主机名
access_log host.access.log; # 访问日志
# 控制网站访问路径
location / {
root /usr/share/nginx/html; # 存放网站代码路径
index index.html index.htm; # 服务器返回的默认页面文件
}
# 指定错误代码, 统一定义错误页面, 错误代码重定向到新的Location
error_page 500 502 503 504 /50x.html;
}
}
nginx配置网站
当我们访问game.weixinyu.com的时候, 访问/weixinyu_code/里面的页面代码, 并且响应头要有business和author这两个字段
- 配置server模块
$ vim /etc/nginx/conf.d/weixinyu.conf
server {
listen 80;
server_name game.weixinyu.com;
location / {
root /weixinyu_code;
index index.html index.htm;
add_header business ops;
add_header authors weixinyu;
}
}
- 检查nginx配置文件语法
$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
- 创建目录
$ mkdir /weixinyu_code
- 关闭default.conf
$ mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.off
- 关闭防火墙和selinux
- 放入代码
echo 'weixinyu' > /weixinyu_code/index.html
- 本地hosts文件做本地DNS解析
C:\Windows\System32\drivers\etc\hosts
需要修改文件权限, 右击属性-安全-Users, 全部允许
192.168.221.20 game.weixinyu.com
- 重启nginx, 重新载入nginx
$ systemctl restart nginx
$ nginx -s reload
- 查看80端口
$ lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 9921 root 6u IPv4 41141 0t0 TCP *:http (LISTEN)
nginx 9923 nginx 6u IPv4 41141 0t0 TCP *:http (LISTEN)