1、Nginx 简易安装
安装软件
下载nginx软件包:📎nginx-1.22.1.tar.gz
# 解压nginx软件包
tar -zxvf nginx-1.22.1.tar.gz -C /usr/local/src
cd /usr/local/src/nginx-1.22.1/
# 安装编译环境
yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel
# 预编译
./configure --prefix=/usr/local/nginx
# 编译安装
make
make install
启动服务
注意:启动服务前修改一下配置文件(80端口被占用),修改nginx的端口为8081。同时关闭firewalld和selinux。
# 修改配置文件端口
vim /usr/local/nginx/conf/nginx.conf
# 进入启动目录,启动服务
cd /usr/local/nginx/sbin
./nginx
# 快速停止
./nginx -s stop
# 优雅关闭,在退出前完成已经接受的连接请求
./nginx -s quit
# 重新加载配置
./nginx -s reload
服务脚本
① 编辑服务文件:vim /usr/lib/systemd/system/nginx.service
(输入a)
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
② 加载服务并重启
# 重新加载系统服务
systemctl daemon-reload
# 查看之前的nginx服务进程,将其干掉
ps -ef | grep nginx
kill -9 xxxx
# 重启服务
systemctl restart nginx
# 设置开机自启动
systemctl enable nginx
# 查看nginx状态
systemctl status nginx
2、Nginx 源码安装
下载解压
# 下载软件
wget http://nginx.org/download/nginx-1.22.0.tar.gz
tar -zxvf nginx-1.22.0.tar.gz -C /usr/local/src
cd /usr/local/src/nginx-1.22.0/
# 安装nginx依赖包
yum install -y gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel
更改源码隐藏软件名称和版本号
vim src/core/nginx.h
vim src/http/ngx_http_header_filter_module.c
vim src/http/ngx_http_special_response.c
# 第29行
"<hr><center>web</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;
- 这个文件定义了 http 错误码的返回,有时候我们页面程序出现错误,Nginx 会代我们返回相应的错误代码,回显的时候,会带上 nginx 和版本号,我们把他隐藏起来。
编译安装启动
# 预编译
./configure --prefix=/usr/local/nginx --with-http_dav_module \
--with-http_stub_status_module --with-http_addition_module \
--with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre \
--with-http_ssl_module --with-http_gzip_static_module
- --with-http_dav_module #启用支持(增加 PUT,DELETE,MKCOL:创建集合,COPY 和 MOVE 方法)。默认关闭,需要编译开启
- --with-http_stub_status_module #获取 Nginx 的状态统计信息
- --with-http_addition_module #作为一个输出过滤器,支持不完全缓冲,分部分 响应请求
- --with-http_sub_module #允许一些其他文本替换 Nginx 相应中的一些文本
- --with-http_flv_module #提供支持 flv 视频文件支持
- --with-http_mp4_module #提供支持 mp4 视频文件支持,提供伪流媒体服务 端支持
- --with-http_ssl_module #启用 ngx_http_ssl_module
- --with-pcre
注意:如果 pcre 是通过编译安装的,需要指定 pcre 安装路径
# 编译
make -j 2
# 安装
make install
# 启动服务
/usr/local/nginx/sbin/nginx
# 添加环境变量
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin
# 查看端口
netstat -antup | grep nginx
#查看服务器类型
curl -I 192.168.137.253:8081
服务脚本
vim /etc/init.d/nginx
#------------------------------------------服务脚本------------------------------
#!/bin/bash
#description:nginx service control script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
netstat -anplt | grep ":8081" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ];then
echo "Nginx service already running."
else
$PROG -t &> /dev/null
if [ $? -eq 0 ];then
$PROG
echo "Nginx service start success."
else
echo "file is error"
$PROG -t
fi
fi
;;
stop)
netstat -anplt | grep ":8081" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ];then
kill -s QUIT $(cat $PIDF)
echo "Nginx service stop success."
else
echo "Nginx service already stop"
fi
;;
restart)
$0 stop
$0 start
;;
status)
netstat -anplt | grep ":8081" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ];then
echo "Nginx service is running."
else
echo "Nginx is stop."
fi
;;
reload)
netstat -anplt | grep ":8081" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ];then
$PROG -t &> /dev/null
if [ $? -eq 0 ]; then
kill -s HUP $(cat $PIDF)
echo "reload Nginx config success."
else
$PROG -t
fi
else
echo "Nginx service is not run."
fi
;;
*)
echo "Usage:$0{start|stop|restart|reload}"
exit 1
esac
#------------------------------------------服务脚本------------------------------
# 给脚本添加可执行权限
chmod +x /etc/init.d/nginx
# 测试脚本
/etc/init.d/nginx start
/etc/init.d/nginx stop
# 操作失败
#chkconfig --add nginx # 把 nginx 添加为系统服务
#chkconfig nginx on # 把 nginx 添加开机自启动
#chkconfig --list nginx # 查看 nginx 开机启动项
3、Nginx 相关配置
修改Nginx运行账号
编译安装 nginx 时若不指定--user=,--group=选项,默认是 nobody 用户
# 创建 nginx 程序账号
useradd -M -s /sbin/nologin nginx
# 修改 nginx 运行账号
vim /usr/local/nginx/conf/nginx.conf
# 语法检测
nginx -t
# 重载 nginx
nginx -s reload
在这里我们还可以看到在查看的时候,worker 进程是 nginx 用户了,但是 master 进程还是 root,master 是监控进程,也叫主进程,worker 是工作进程。
master 监控进程使用 root 用户,也可以是降级使用普通用户,如果都是用普用户,那么编译安装的时候,是用普通用户执行,sudo 方式操作。
设置Nginx运行进程个数
Nginx 运行进程个数一般我们设置 CPU 的核心或者核心数 x2
# 查看 cpu 个数 -> 2
grep ^processor /proc/cpuinfo | wc -l
# 设置 nginx 中进程数
vim /usr/local/nginx/conf/nginx.conf
# 重载 nginx 配置文件
nginx -s reload
设置Nginx的CPU亲和力
这个要根据你的 CPU 线程数配置,worker_processes 最多开启 8 个,8 个以上性能提升不会再提升了,而且稳定性变得更低,所以 8 个进程够用了。
vim /usr/local/nginx/conf/nginx.conf
# 2 核 CPU,开启 2 个进程
worker_processes 2;
worker_cpu_affinity 01 10;
# 4 核 4 线程配置
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
# 8 核 8 线程配置
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000
00010000 00100000 01000000 10000000;
# 4 线程的 CPU 跑两个进程
worker_processes 2;
worker_cpu_affinity 0101 1010;
- 第一个进程在第一个和第三个 cpu 上运行,第二个和第四个 cpu 上运行,两个进程分别在这两个组合上轮询!
设置nginx最多打开的文件数
当一个 nginx 进程打开的最多文件数目,理论值应该是最多打开文件数(ulimit -n)与 nginx 进程数相除,但是 nginx 分配请求并不是那么均匀,所以最好与 ulimit -n 的值保持一致。
vim /usr/local/nginx/conf/nginx.conf
worker_rlimit_nofile 102400;
# 修改系统可以打开的最大文件数
# 临时修改
ulimit -n
ulimit -n 102400
# 永久修改:修改 linux 的软硬件限制文件/etc/security/limits.conf
* soft nofile 102400
* hard nofile 102400
4、Nginx 事件处理模型
vim /usr/local/nginx/conf/nginx.conf
events {
use epoll;
# 单个进程允许客户端最大并发连接数
worker_connections 65535;
}
worker_connections 102400;
:这个数值一般根据服务器性能和内存来制定,也就是单个进程最大连接数,实际nginx 服务器最大并发值就是 work 进程数乘以这个数。
如何设置,可以根据一个进程启动所占内存,top -u nginx,但是实际我们填入一个 102400,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了!
IO 多路复用的机制
nginx 采用 epoll 事件模型,select,poll,epoll 都是 IO 多路复用的机制。I/O 多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
epoll 优势:
① Epoll 没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048, 一般来说这个数目和系统内存关系很大,具体数目可以 cat /proc/sys/fs/file-max
察看。
② 效率提升,Epoll 最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll 的效率就会远远高于 select 和 poll。
③ 内存拷贝,Epoll 在这点上使用了“共享内存”,这个内存拷贝也省略了。