概述
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是内存利用率高,并发能力强。
工作模式
nginx有两种工作模式:master-worker模式和单进程模式。在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。
master-worker:
该模式下,nginx启动成功后,会有一个master进程和至少一个的worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式,因为这种模式有以下优点:
- 稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。
- 配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能
- 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启)
单进程模式:
单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。
Nginx配置文件详解
user www www;
#程序运行用户和组
worker_processes auto;
#启动进程,指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般等于cpu核心数目
error_log /home/wwwlogs/nginx_error.log crit;
#全局错误日志
pid /usr/local/nginx/logs/nginx.pid;
#主进程PID保存文件
worker_rlimit_nofile 51200;
#文件描述符数量
events
{
use epoll;
#使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能
worker_connections 51200;
#工作进程的最大连接数量,根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行每个进程允许的最多连接数, 理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,具体还要看服务器的硬件、带宽等。
}
http
#整体环境配置--网站配置
{
include mime.types;
default_type application/octet-stream;
#设定mime类型,文件传送类型由mime.type文件定义
server_names_hash_bucket_size 128;
#保存服务器名字的hash表大小
client_header_buffer_size 32k;
#客户端请求头部缓冲区大小
large_client_header_buffers 4 32k;
#最大客户端头缓冲大小
client_max_body_size 50m;
#客户端最大上传文件大小(M)
sendfile on;
#sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
tcp_nopush on;
#这个是默认的,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。(只在sendfile on时有效)
keepalive_timeout 60;
#连接超时时间
tcp_nodelay on;
#禁用nagle算法,也即不缓存数据。有效解决网络阻塞
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
#fastcgi设置
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application xml+rss;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
#limit_conn_zone $binary_remote_addr zone=perip:10m;
##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.
server_tokens off;
#隐藏nginx版本号(curl -I 192.168.4.154可以查看,更加安全)
#log format
log_format access '$remote_addr - $remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定义日志格式
server
{
listen 80 default_server;
#listen [::]:80 default_server ipv6only=on;
#监听80端口,WEB服务的监听设置,可以采用"IP地址:端口"形式
server_name www.lnmp.org lnmp.org;
#服务器名,可以写多个域名,用空格分隔
index index.html index.htm index.php;
#默认网页文件
root /home/wwwroot/default;
#网页主目录
#error_page 404 /404.html;
include enable-php.conf;
location /nginx_status
{
stub_status on;
access_log off;
}
#开启status状态监测
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
#静态文件处理,保存期30天
location ~ .*\.(js|css)?$
{
expires 12h;
}
#js和css文件处理,保存期12小时
location ~ /\.
{
deny all;
}
access_log /home/wwwlogs/access.log access;
#正确访问日志
}
include vhost/*.conf;
#vhost/下子配置文件生效
}
nginx安装
安装包可以在Nginx的官网的下载页面中(http://nginx.org/en/download.html)根据自己的需求下载对应的版本。
我这里下载的是1.22.1版本
wget https://nginx.org/download/nginx-1.22.1.tar.gz
由于nginx是基于c语言开发的,所以安装nginx之前需要安装c语言的编译环境,及正则表达式库等第三方依赖库。
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
安装nginx
#解压之前下载的nginx安装包
tar -zxvf nginx-1.22.1.tar.gz
cd nginx-1.22.1
#初始化Nginx
./configure --prefix=/usr/local/nginx
#编译和安装
make & make install
查看对应的ip和端口
访问nginx页面
nginx安装成功
Nginx相关用法
用法1. Nginx的状态统计
安装nginx时将 --with-http_stub_status_module 模块开启
#创建系统用户
useradd -r -s /usr/sbin/nologin nginx
#进入到nginx安装包解压目录
cd nginx-1.22.1
#之前安装过一次nginx,因此需要make clean
make clean
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
修改nginx配置文件(写入要访问的server标签中)
location /status {
stub_status on;
access_log off;
}
注:修改配置文件后需要重启nginx才能生效
"Active connections"表示当前的活动连接数;
"server accepts handled requests"表示已经处理的连接信息
三个数字依次表示已处理的连接数、成功的TCP握手次数、已处理的请求数
用法2. 目录保护
#在状态统计的location中添加
auth_basic "Welcome to nginx_status!";
auth_basic_user_file
#使用Apache的命令htpasswd进行用户密码文件的创建(生成在上面指定的位置)
htpasswd -c /usr/local/nginx/html/htpasswd.nginx user
#重启nginx并再次访问统计页面
因为是使用Apache的命令htpasswd,如果报错“未找到命令”,请先yum -y install httpd
安装apache
现在访问页面需要输入用户和密码
用法3. 基于IP的身份验证(访问控制)
#在状态统计的location中添加
allow 192.168.136.1;
deny 192.168.136.0/24;
#仅允许192.168.136.1访问服务器
192.168.136.1可以正常访问
现在其他ip访问则是这种现象
用法4. nginx的虚拟主机
目前有基于域名和基于端口的方法,这里演示基于域名的方法
1.提前准备好两个网站的域名,并且规划好两个网站网页存放目录
cd /usr/local/nginx/html/
mkdir aaa
mkdir bbb
2.然后分别在这两个目录下面写 index.html 这两个文件并写入测试内容
echo "I am aaa!!!!!!" > aaa/index.html
echo "I am bbb!!!!!!!" > aaa/index.html
3.在Nginx主配置文件中并列编写两个server标签,并分别写好各自信息
4.测试
用法5. nginx的反向代理
Nginx反向代理是一种服务器架构模式,其中Nginx服务器充当反向代理服务器,接收客户端的请求并将其转发到后端服务器。
nginx反向代理搭建
1.在另外一台机器上(192.168.136.4)安装nginx,启动并填写测试页面
在nginx反向服务器(192.168.136.3)的配置文件中添加(写在要访问的server标签内)
location / {
proxy_pass http://192.168.136.4:80; #此处填写后端nginx服务器的IP地址
}
现在访问这台反向代理服务器(192.168.136.3)
反向代理成功。
用法6. 负载均衡
代理服务器可以将用户访问请求,根据多种负载算法分发到后端目标服务器上处理,减轻单台服务器过载,同时消除单点故障。反向代理还可以将传入的请求同时定向到多台服务器,每台服务器执行特定优化功能,反向代理收集所有服务器响应以后汇总传递给用户。
负载均衡有多种算法(轮询、加权轮询、最小连接数...),这里演示轮询算法
1.再部署两台nginx服务器
2.修改反向代理服务器配置文件
upstream aaa { #此标签在server标签前添加
server 192.168.136.4:80;
server 192.168.136.5:80;
}
server {
........;
#修改自带的location / 的标签,将原内容删除,添加下列两项
location / {
proxy_pass http://bbs; #添加反向代理,代理地址填写upstream声明的名字
proxy_set_header Host $host; #重写请求头部,保证网站所有页面都可访问成功
}
}
页面访问代理服务器(192.168.136.3)
点击刷新,流量会不断的在nginx2(192.168.136.4)和nginx3(192.168.136.5)轮询。负载均衡搭建成功。
用法7. nginx实现https{证书+rewrite}
1.安装nginx时,需要将--with-http_ssl_module 模块开启
2.在对应要进行加密的server标签中添加以下内容开启SSL
3.新增以下server标签(利用虚拟主机+rewrite的功能)
4.生成证书和秘钥文件
# openssl genrsa -out kernel.key 1024
建立服务器私钥,生成RSA密钥
# openssl req -new -key kernel.key -out kernel.csr
需要依次输入国家,地区,组织,email。最重要的是有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书
# openssl x509 -req -days 365 -sha256 -in kernel.csr -signkey kernel.key -out kernel.crt
生成签字证书
# cp kernel.crt /usr/local/nginx/conf/ssl/kernel.crt
# cp kernel.key /usr/local/nginx/conf/ssl/kernel.key
将私钥和证书复制到指定位置
5.重启nginx后访问nginx服务器的域名(ccc.lyw.com)
会自动跳转到https://ccc.lyw.com
用法8. 关键字屏蔽页面
1.在server标签下新增location模块
2.这里配置的是,只要请求带有status关键字的都会被屏蔽,并返回403。这里用到了location的匹配规则,就不详细说了,大家自行去了解。
网页测试,屏蔽成功
关键字屏蔽在各种项目都会经常用到,如屏蔽特定浏览器访问,屏蔽某些服务器访问,屏蔽所有网页端访问、只允许小程序端访问等等。感兴趣的朋友可以自己去深入了解。
用法9. 其他用法
nginx的用法广泛,以上只是演示了常用的8种用法。除了以上8种,还有跟多用法,网上资源比较多,大家自行去了解。