Nginx(发音同engine x)是一款由俄罗斯程序员Igor Sysoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。此软件BSD-like协议下发行,可以在UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及MicrosoftWindows等操作系统中运行。在Linux操作系统下,nginx使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或 FreeBSD操作系统上采用类似于epoll的高效事件模型kqueue。
特点:
作为web服务器:处理静态文件,索引文件,自动索引的效率较高
作为代理服务器:实现无缓存的反向代理加速,提高网站运行速度
作为负载均衡服务器:内部支持Rails和PHP,也可以支持HTTP代理服务器对进行服务
性能方面: 采用epoli模型,可以支持更多的并发连接,量大的恶意支持5万和并发连接数的响应
稳定性方面:才去分阶段资源分配技术,是的cpu与内存占用率非常低
高可用方面:支持热部署,平滑升级,启动速度快
应用场景
使用Nginx结合FastCGI运行PHP,JSP,Perl等程序
使用Nginx反向代理,负载均衡,规则过滤
使用Nginx运行静态HTML页,图片
使用Nginx加cache插件实现对web服务器缓存功能
Nginx与其他新技术的结合应用
Nginx应用瓶颈和注意事项
Nginx模块需要用C语言开发,必须符合一系列的规则,且需要熟悉Nginx的源代码,大大增加开发难度
Nginx处理请求过程
首先,Nginx启动时,会解析配置文件,得到需要监听的端口和IP地址,在Nginx的master进程里先初始化监控的socket,在进行listen,然后fork多个子进程,子进程会竞争accept新的链接,此时,客户端就可以想Nginx发起连接了。
当客户端与Nginx进行三次握手,建立好一个链接后,某一个子进程会accept成功,然后进行Nginx对链接的封装,即ngx_connection_t结构体,此时根据时间调用相应的事件处理模块,如http模块与客户端进行数据交换。最后nginx或客户端来主动关闭链接。
包的获取:
RPM包:http://nginx.org/packages/
源码包:http://nginx.org/download/
源码安装
#mkdir -p /opt/data/nginx/
groupadd nginx
useradd -g nginx nginx
# 安装依赖包,编译工具
yum install gcc gcc-c++ make recp pcre-devel openssl openssl-devel -y
yum install -y pcre-devel openssl-devel
ls nginx-1.15.0.tar.gz
tar -xf nginx-1.15.0.tar.gz -C /usr/local/src/
cd /usr/local/src/nginx-1.15.0
./configure --prefix=/opt/data/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream # echo $? 查看预编译是否有问题,下面同样查看
make && make install # 配置环境变量 # cd /opt/data/nginx/sbin/ # ./nginx -t # 查看nginx配置是否有问题
vim /etc/profile.d/nginx.sh
export PATH=/opt/data/nginx/sbin:$PATH # 此处$PATH的位置决定环境变量加载顺序
source /etc/profile
# Nginx配置
cd /opt/data/nginx/conf
ln -s /opt/data/nginx/conf /etc/nginx
mv nginx.conf nginx.conf.bak
vim nginx.conf
user nginx; # 用户
nginx pid /var/run/nginx.pid; #pid文件位置
events {
worker_connections 1024;
}
http {
access_log off;
client_max_body_size 128M;
include /etc/nginx/conf.d/*.conf;
}
mkdir /etc/nginx/conf.d
mkdir /var/log/nginx
chown -R nginx:nginx /var/log/nginx
# Nginx启动
Vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/opt/data/nginx/sbin/nginx -t -c /opt/data/nginx/conf/nginx.conf
ExecStart=/opt/data/nginx/sbin/nginx -c /opt/data/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
yum安装
# 本次安装过程一直显示公钥问题,要把配置的源gpgcheck改为0,才能安装
# 下载nginx源
# ls nginx-1.18.0-1.el7.ngx.x86_64.rpm
# yum localinstall nginx-1.8.0-1.el7.ngx.x86_64.rpm
# yum install nginx -y # 此方法会给上面安装 的升级,需要注意公钥的问题
--配置文件 /etc/nginx/nginx.conf
--主目录 /usr/share/nginx/html/
--查看版本 /usr/sbin/nginx -v
--配置文件语法检查 /usr/sbin/nginx -t
--服务启动停止 /etc/init.d/nginx {start|stop|restart|reload|status}
注意:若需要gzip和rewrite的正则,需要zlib,zlib-devel,pcre已经安装好。
检查测试
虚拟主机介绍
所谓的虚拟主机,在web服务器里就是一个独立的网络站点,这个站点对应独立的域名(也可能是IP或端口),具有独立的程序及资源目录,可以独立地对外服务供用户访问。
# cd /opt/data/nginx
# mkdir data
# cd data
# mkdir -p test1/basic
# mkdir -p test2/basic
# chown -R nginx:nginx test1/basic
# chown -R nginx:nginx test2/basic
# mkdir -p test1/log
# mkdir -p test2/log
# chown -R nginx:nginx test1/log/
# chown -R nginx:nginx test2/log/
# vim test1/basic/index.html
This is a test from www.test1.com
# vim test2/basic/index.html
This is a test from www.test2.com of 192.168.10.21
# cd /opt/data/nginx/conf/conf.d
# vim test1.conf
server {
listen 192.168.10.21:80;
server_name www.test1.com;
access_log /opt/data/nginx/data/test1/log/access.log combined;
location / {
root /opt/data/nginx/data/test1/basic;
index index.html index.htm;
}
}
# vim test2.conf
server {
listen 192.168.10.21:80;
server_name www.test2.com;
access_log /opt/data/nginx/data/test2/log/access.log combined;
location / {
root /opt/data/nginx/data/test2/basic;
index index.html index.htm;
}
}
# nginx -t #检查语法
注:主机hosts文件:C:\Windows\System32\drivers\etc
192.168.10.21 www.test1.com
192.168.10.21 www.test2.com
测试
# 创建域名对应的站点目录文件
# cd /opt/data/nginx/conf/conf.d
# vim test3.conf s
erver {
listen 192.168.10.21:6969;
server_name www.test3.com;
access_log /opt/data/nginx/data/test3/log/access.log combined;
location / {
root /opt/data/nginx/data/test3/basic;
index index.html index.htm;
}
}
# vim test4.conf
server {
listen 192.168.10.21:8080;
server_name www.test4.com;
access_log /opt/data/nginx/data/test4/log/access.log combined;
location / {
root /opt/data/nginx/data/test4/basic;
index index.html index.htm;
}
}
# cd /opt/data/nginx/data
# cp -R test2 test3
# cp -R test2 test4
# vim test3/basic/index.html
This is a test from www.test3.com of 192.168.10.21:6969
# vim test4/basic/index.html
This is a test from www.test4.com of 192.168.10.21:8080
# echo "" > test3/log/access.log
# echo "" > test4/log/access.log
# chown -R nginx:nginx test3/basic/
# chown -R nginx:nginx test3/log
# chown -R nginx:nginx test4/basic/
# chown -R nginx:nginx test4/log/
# systemctl restart nginx
# 另一个主机加上个域名解析
# vim /etc/hosts
192.168.10.21 www.test3.com
192.168.10.21 www.test4.com
测试
# (1) 创建站点目录文件
# cat test5.comf
server {
listen 10.10.10.11:80;
server_name www.test5.com;
access_log /opt/data/nginx/data/test5/log/access.log combined;
location / {
root /opt/data/nginx/data/test5/basic;
index index.html index.htm;
}
}
# cat test6.conf
# cat test5.comf
server {
listen 10.10.10.11:80;
server_name www.test6.com;
access_log /opt/data/nginx/data/test6/log/access.log combined;
location / {
root /opt/data/nginx/data/test6/basic;
index index.html index.htm;
}
}
# cd /opt/data/nginx/data/
# cp -R -p test3 test5
# cp -R -p test3 test6
# echo "" > test5/log/access.log
# echo "" > test6/log/access.log
# vim test5/basic/index.html
This is a test from www.test5.com of 10.10.10.11
# vim test6/basic/index.html
This is a test from www.test6.com of 10.10.10.21
# 添加ip
# ip addr add 10.10.10.11 dev ens33
# ip addr add 10.10.10.21 dev ens33
# 另一台机子添加域名解析和路由
# cat /etc/hosts 10.10.10.11
www.test5.com 10.10.10.21
www.test6.com
# ip route add 10.10.10.11 via 192.168.10.21 dev ens33
# ip route add 10.10.10.21 via 192.168.10.21 dev ens33
------------------------------------------------------------------------------------------------------- 返回目录