首页 > 代码库 > nginx
nginx
nginx是一款轻量级的web服务器、也是一个高性能的HTTP和反向代理服务器及电子邮件(IMAP/POP3/SMTP)代理服务器,由俄罗斯lgor Sysoev所开发。
实验环境:rhel6 selinux and iptables disabled
实验主机: 172.25.38.1 nginx(主机1)
1.nginx 安装
yum install -y pcre-devel openssl-devel ##解决依赖性
tar zxvf nginx-1.0.2.tar.gz ##下载解压压缩包
cd nginx-1.0.2
vim auto/cc/gcc
#CFLAGS=”$CFLAGS -g”
##(注释掉这行,去掉 debug 模式编译,编译以后程序只有几百 k)
vim src/core/nginx.h
#define NGINX_VERSION "1.0.2”
#define NGINX_VER "nginx"
##(修改此行,去掉后面的“NGINX_VERSION”,为了安全,这样编译后外界无法获取程序的版本号)
[root@westos1 nginx-1.10.1]# du -sh ##目前目录大小
8.7M .
[root@westos1 nginx-1.10.1]#./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module
##编译,后跟路径和参数编译完成后会出现Makefile 和 objs
[root@westos1 nginx-1.10.1]# make && make install ##在有Makefile的目录下执行(##编译三部曲./configure && make && make install)
[root@westos1 nginx-1.10.1]# cd /usr/local/lnmp/nginx/sbin/
[root@westos1 sbin]# ls
nginx
[root@westos1 sbin]# ./nginx ##编译
[root@westos1 sbin]# netstat -antlp | grep nginx ##查看监听端口
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3810/nginx
[root@westos1 sbin]# cd ..
[root@westos1 nginx]# du –sh ##编译后目录大小
932K .
[root@westos1 nginx-1.10.1]# echo $PATH ##查看环境变量 #将命令链接或移动到环境变量下,命令才能不加路径直接执行
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@westos1 ~]# ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/local/sbin/
##建立软连接,直接将nginx作为系统指令,或在/etc/profile 输入指令 export PATH=$PATH:/usr/local/lnmp/nginx/sbin,保存退出后,刷新source /etc/profile
[root@westos1 ~]# which nginx
/usr/local/sbin/nginx
[root@westos1 ~]# nginx -s stop ##关闭 nginx
[root@westos1 ~]# nginx ##运行 nginx
[root@westos1 ~]# nginx -s reload ##重载主配置文件
[root@westos1 ~]# nginx –t ##检测语法
[root@westos1 ~]# useradd -u 900 -s /sbin/nologin nginx ##建立用户nginx
删除编译步骤:
rm -fr /usr/local/lump/nginx
cd nginx.1.10.1
make clean
cd ..
rm -fr nginx.1.10.1 ##删除源码
2.配置nginx多核cpu
##查看cpu
以下操作可以优化nginx,使它运行更高效
说明:
nginx默认没有开启利用多核CPU,我们可以通过增加worker_cpu_affinity配置参数来充分利用多核CPU。CPU是任务处理,计算最关键的资源,CPU核越多,性能就越好。
配置nginx多核CPU,worker_cpu_affinity使用方法:
A、2核cpu,开启2个进程
worker_process 2;
worker_cpu_affinity 01 10;
##01 表示启用第一个cpu内核,10 表示启用第二个cpu内核。
worker_cpu_affinity 01 10;表示启用两个进程。第一个进程对应第一个CPU内核,第二个进程对应第二个CPU内核
B、2核cpu,开启4个进程
worker_process 4;
worker_cpu_affinity 01 10 01 10;
##开启了4个进程,他们分别对应着开启2个CPU 内核
C、4核cpu,开启4个进程
worker_process 4;
worker_cpu_affinity 0001 0010 0100 1000;
##0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,以此类推。
D、4核cpu,开启2个进程
worker_process 2;
worker_cpu_affinity 0101 1010;
0101 表示开启第一个和第三个内核,1010 表示开启第二个和第四个内核。两个进程对应四个内核
E、8核CPU,开启8个进程
worker_process 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
0001 表示启用第一个CPU内核,0010 表示启用第二个CPU内核,以此类推。
2核 | 4核 | 8核 |
01 | 0001 | 0000 0001 |
有多少核就有几位数,1 表示该内核开启,0 表示关闭
worker_process最多开启8个,8个以上性能不会再提升了,而且稳定性变得更低,所以8个进程够用了。
配置完成后,重启nginx。
worker_cpu_affinity是写在编译后的目录的/nginx/nginx.conf(主配置文件)里面的。
vim /usr/local/lnmp/nginx/conf/nginx.conf
user nginx; ##用户nginx
worker_processes 2; ##工作进程数
worker_cpu_affinity 01 10;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; ##错误日志存放路径
#pid logs/nginx.pid;
events {
use epoll; ##使用epoll高效模式
worker_connections 4096; ##工作进程的最大连接数量,尽量大
}
##检测语法并重载主配置文件
[root@westos1 conf]# ps -axu
##修改前
##修改后
##虚拟机死机,重启即可
附加:用户limit
vim /etc/security/limits.conf
[wxh@westos1 root]$ ulimit –a ##查看当前用户进程限制
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7812
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 100
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
3.http
#keepalive_timeout 0;
keepalive_timeout 65; ##keepalive超时时间
#gzip on;
server {
listen 80; ##监听端口
server_name localhost; ##配置访问域名
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location /status {
stub_status on;
access_log off; ##设定查看nginx状态的地址
}
#error_page 404 /404.html;
浏览器测试:
4.ssl 证书
vim /usr/local/lnmp/nginx/conf/nginx.conf
cd /etc/pki/tls/certs
make cert.pem ##生成自签证书
mv cert.pem /usr/local/lnmp/nginx/conf/ ##将生成的证书移动到编译后的目录
nginx -t
nginx -s reload
[root@westos1 certs]# netstat -antlpe | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 10519 1522/nginx
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 0 10807 1522/nginx
网页测试:
或者
重写网页1:
vim /usr/local/lnmp/nginx/conf/nginx.conf
server {
listen 80;
server_name westos1.example.com;
vim /usr/local/lnmp/nginx/html/index.html
nginx -t
nginx -s reload
网页测试
注意网页名变化
重写网页2:
vim /usr/local/lnmp/nginx/conf/nginx.conf
同时删除/usr/local/lnmp/nginx/html/index.html “重写网页1”里添加的内容
nginx -t
nginx -s reload
网页测试
效果同上
5.配置虚拟主机
vim /usr/local/lnmp/nginx/conf/nginx.conf
##注释
mkdir /www1 /www2
vim /www1/index.html
h1>www.server1</h1>
vim /www2/index.html
<h1>bbs.server2</h1>
nginx -t
nginx -s reload
在物理机做好解析,在网页测试
6.配置负载均衡
实验主机: 172.25.38.1 nginx(主机1)
172.25.38.2 apache(主机2)
172.25.38.3 apache(主机3)
172.25.38.250 物理机
**主机2:
vim /var/www/html/index.html
<h1>www.westos.org-server2</h1>
/etc/init.d/httpd start
**主机3
vim /etc/httpd/conf/httpd.conf ##还原httpd设置
#NameVirtualHost *:80
/etc/init.d/httpd start
在网页中测试是否配置成功
**主机1
vim /usr/local/lnmp/nginx/conf/nginx.conf ##添加和修改
注意:
http {
upstream zhang{
server 172.25.38.2:80;
server 172.25.38.3:80;
}
server {
listen 80;
server_name www.westos.org;
location / {
proxy_pass http://zhang;
}
}
网页测试:
刷新------------>
**物理机测试
[kiosk@foundation38 ~]$ for i in $(seq 10); do curl www.westos.org;done
<h1>www.westos.org-server2</h1>
<h1>bbs.westos.org-server3</h1>
<h1>www.westos.org-server2</h1>
<h1>bbs.westos.org-server3</h1>
<h1>www.westos.org-server2</h1>
<h1>bbs.westos.org-server3</h1>
<h1>www.westos.org-server2</h1>
<h1>bbs.westos.org-server3</h1>
<h1>www.westos.org-server2</h1>
<h1>bbs.westos.org-server3</h1>
几种模块举例
(1).连续命中
nginx -t
nginx -s reload
(2)
(3)
说明:
weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
Ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器。
backup: 其他所有的非backup机器down或者忙的时候,请求backup机器
nginx与apache的比较:
1.轻量级,同样起web服务,比apache占用更少的内存及资源
2.抗并发,nginx处理请求是异步非阻塞的,而apache是同步阻塞型的,在高并发下nginx能保持低资源低消耗高性能,apache是同步多进程模型,一个连接对应一个进程;nginx是异步,多个连接可以对应一个进程
3.高度模块化的设计,编写模块相对简单
4.nginx处理静态文件好,耗费内存少,一般动态请求要apache去做,nginx适合做静态和反向
***进程与线程**
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不止是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。通常在一个进程中可以包括若干个线程,它们可以利用进程所拥有的资源,在引入线程操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对他的调度所付出的开销就会小的多,能更高效的提高系统内多个程序间并发执行的程序。线程与进程的区别在于,子进程与父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文,多线程主要是为了节约cpu时间,发挥iu利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和cpu。
1.进程间相互独立,通一进程的各线程间相互共享。某进程的各线程间共享。某进程内的线程在其它进程不可见。
2.进程是具有一定独立功能的程序关于某个数据集合上的一个独立单位,线程是进程的一个实体,是cpu调度和分派的基本单位。
*****阻塞,非阻塞*****
进程/线程要访问的数据是否就绪,进程/线程是否需要等待
阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线端服务器。程只有在得到结果之后才会被返回。
非阻塞调用是指在不能立刻得到结果之前,该调用不会阻塞当前线程
**同步,异步**
访问数据的方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞,直到I/O操作完成;异步只需要I/O操作完成的通知,并不主动读写数据,由操作系统内核完成数据的读写。
nginx