一、Nginx
1. Nginx概述
Nginx是一个高并发、轻量级的Web服务软件。性能稳定性高,系统资源消耗率低。对HTTP的高并发处理能力高,单台物理服务器支持3~5万的并发量。在实际使用中,Nginx的并发量通常设置在2万左右。
-
静态页面处理能力
Nginx的主要功能是处理静态的页面,包括文本、图片等。
-
动态页面处理能力
动态页面的处理能力较差,一般是将动态请求转发到中间件,然后通过中间件将请求转发到后端进行处理。中间件是位于客户端和服务器之间的软件,主要用于处理客户端发出的请求和服务器返回的响应,常见的有PHP、Python等。
-
正向代理和反向代理
正向代理是指通过代理的地址,访问目标地址。客户端将对服务端的请求先发送到代理服务,代理服务转发请求并返回响应给客户端,客户端是知道正向代理的存在。
反向代理是客户端将请求直接发送给代理服务,代理会根据算法转发到服务端,以实现负载均衡的功能,客户端是不知道反向代理的存在。
-
支持SSL/TLS加密,支持HTTPS协议。
-
支持虚拟主机,在Nginx配置中可以设置多个域名。
-
Nginx自带缓存机制,可以缓存静态文件。
-
自带日志文件,但Nginx没有日志分隔的功能,只记录直接的业务日志。启动日志、停止日志和错误日志不会记录在里面。
2. 同步和异步
同步指的是在执行某个任务时,必须等待这个任务完成后才能继续执行下一个任务。是一个可靠的序列,要么都执行成功,要么都执行失败。
异步是指在执行某个任务时,不用等待这个任务完成就可以执行其他的任务。一个任务完成依赖其他的任务,但只是通知其他任务开始执行,并不需要依赖任务的执行结果,是一个不可靠的序列。
Nginx运行快,就是因为采用了异步的处理方式。
3. 阻塞和非阻塞
阻塞是指在调用结果返回之前,当前的线程会被挂起,一直等待结果的返回。这个期间是无法执行其他的任务。
非阻塞不需要等待调用的结果,不能立刻得到执行结果并不会影响后续任务执行,线程可以继续执行其他的任务。
Nginx服务采用的就是非阻塞方式。
二、Nginx安装
1. 编译安装流程
-
关闭系统的防火墙开机自启动,以免其他网络无法访问相关程序。非必要步骤。
ufw disable
-
安装程序的依赖环境。
apt -y install libpcre3-dev zlib1g-dev libssl-dev build-essential
-
libpcre3-dev:这是 Perl 兼容正则表达式库(PCRE)的开发包。提供了开发库和头文件,用于在其他程序中使用 PCRE 库。
-
zlib1g-dev:这是 zlib 库的开发包。提供了开发库和头文件,用于在其他程序中使用 zlib 进行数据压缩和解压缩。
-
libssl-dev:这是 OpenSSL 库的开发包。提供了开发库和头文件,用于在其他程序中使用 OpenSSL 进行安全通信。
-
build-essential:这是一个元包,它自动安装编译 C 和 C++ 程序所需的基本工具和库,包括 gcc(GNU 编译器集合)、g++(GNU C++ 编译器)、make(构建工具)等。
-
-
创建程序的执行用户。
useradd -M -s /sbin/nologin nginx
- -M:不创建用户的家目录。
- -s:设置用户的登录 shell。/sbin/nologin是一个特殊的shell,禁止用户登录。通常用于不需要交互式登录,只用于运行特定服务的用户。
- nginx:创建的用户名。
-
软件包解压缩。
tar -xf nginx-1.22.0.tar.gz
-
进入软件源码包,执行configure文件,配置程序的安装路径和执行用户,以及启动的组件。
./configure --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-pcre \ --with-stream \ --with-stream_ssl_module \ --with-stream_realip_module
-
编译并安装。
make && make install
-
创建软链接,便于直接使用nginx命令来调用Nginx程序。
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
-
在安装目录下创建一个run目录,用于存放Nginx程序的PID文件。并修改安装目录的所有者和所有组。
mkdir /usr/local/nginx/run chown -R nginx.nginx /usr/local/nginx
-
进入Nginx程序安装目录下的配置目录conf,修改配置文件nginx.conf,设置Nginx程序PID文件的位置。
pid /usr/local/nginx/run/nginx.pid;
保存退出后,可执行下面的命令,查看配置是否存在问题。
nginx -t
-
编写Nginx程序的系统服务。
vim /lib/systemd/system/nginx.service
在文件中写入以下内容:
[Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/usr/local/nginx/run/nginx.pid #注意文件位置,如果不对 启动不了 ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #注意启动文件位置 ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID [Install] WantedBy=multi-user.target
-
启动Nginx服务。
# 配置完服务文件后,重新加载系统服务 systemctl daemon-reload # 设置Nginx服务开机自启动 systemctl enable nginx # 启动Nginx服务 systemctl start nginx # restart是重启
-
查看Nginx程序的PID。
netstat -anutp | grep nginx
-
在本机浏览器中访问虚拟机的Nginx服务,IP为虚拟机的IP地址,端口为80,可不写。还可以编辑Nginx安装目录下html目录中的index.html文件,自定义页面显示内容。
2. Nginx主要目录
- conf:Nginx配置文件目录。
- logs:Nginx日志文件目录。
- sbin:Nginx操作命令目录。
- html:Nginx访问的Web页面。
3. Nginx主配置文件
Nginx服务的主配置文件是安装目录下的conf/nginx.conf文件。nginx.conf文件主要分为五大部分:全局模块、events模块、http模块、server模块和location模块
- 全局模块:全局配置,全局有效。
- events模块:主要配置Nginx服务的进程连接数。
- http模块:配置代理、缓存、日志和第三方模块。
- server模块:位于http模块中,主要用于配置虚拟主机相关参数。
- location模块:位于server模块中,主要用于配置网站的URL。
3.1 全局模块
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid /usr/local/nginx/run/nginx.pid;
- user:Nginx服务的运行用户,注释掉则默认是自定义的程序用户。
- worker_processes:工作进程数,一般不超过8。
- pid /usr/local/nginx/run/nginx.pid:Nginx进程文件的存放位置。
3.2 events模块
events {
worker_connections 1024;
}
-
worker_connections:配置每个工作进程的最大连接数。
-
Nginx并发量=工作进程数*工作进程连接数
-
Linux系统会限制每个进程的最大连接数,因此要修改Nginx的并发,就还要修改系统的限制。
-
使用ulimit -a查看系统允许的进程最大链接数。
-
编辑/etc/security/limits.conf文件实现永久修改。基本格式如下所示:
nginx hard nofile 30000
nginx:用户或用户组。
hard:硬限制,还可以使用soft设置软限制。
nofile:限制项目,nofile表示最大连接数。
30000:设置的具体数量。
-
3.3 http模块
http {
# 文件扩展名和文件类型的映射表
include mime.types;
# Nginx支持的默认文件类型
default_type application/octet-stream;
# Nginx的日志格式
#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 logs/access.log main;
# 支持文件发送(下载文件)
sendfile on;
# 发送数据包前先缓存数据
#tcp_nopush on;
# 连接保持时间
#keepalive_timeout 0;
keepalive_timeout 65;
# 是否对响应数据进行压缩
#gzip on;
# server模块配置
server {
# 配置监听端口
listen 80;
# 配置站点域名
server_name localhost;
# 配置页面的字符集
#charset koi8-r;
# 配置日志文件位置
#access_log logs/host.access.log main;
# 匹配URL
location / {
# 匹配文件系统的根目录,相对路径是相对Nginx服务的安装目录
root html;
# 指定默认的首页文件
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
三、Nginx常见配置
1. 配置访问状态统计
-
在配置文件中新增一个location模块。
location /status { stub_status on; access_log off; }
-
stub_status:是否开启Nginx的状态统计功能。
-
access_log:是否关闭日志功能。
-
-
重启Nginx访问,在浏览器中访问的URL。
2. 配置用户授权服务
-
下载apache2软件包。
apt -y install apache2
-
使用htpasswd命令设置访问网页的用户和密码,并写入指定文件。
htpasswd -c /usr/local/nginx/passwd.db test
-
修改密码文件的用户和权限。
chown nginx /usr/local/nginx/passwd.db chmod 400 /usr/local/nginx/passwd.db
-
在配置文件中新增授权访问功能。
location / { root html; index index.html index.htm; auth_basic "secret"; auth_basic_user_file /usr/local/nginx/passwd.db; }
- auth_basic “secret”:开启认证功能,用户访问页面时需要进行用户认证。
- auth_basic_user_file:设置用于认证的密码文件。
-
重启Nginx访问,在浏览器中访问的URL。
3. 配置基于域名的虚拟主机
-
编辑nginx.conf配置文件,在文件中新增一个server模块。
server { listen 80; server_name www.test1.com; charset utf-8; access_log logs/test1.com.access.log; location / { root html; index index.html; } } server { listen 80; server_name www.test2.com; charset utf-8; access_log logs/test2.com.access.log; location / { root /var/www/html; index index.html; } }
-
检查Nginx配置文件是否存在语法问题,重启Nginx服务。
nginx -t systemctl restart nginx
-
在指定的两个index.html文件中,分别写入以下内容。
# /usr/local/nginx/html/index.html 这里是test1。 # /var/www/html/index.html 这里是test2。
-
配置/etc/hosts文件。
192.168.1.128 www.test1.com www.test2.com
-
在浏览器访问两个域名,查看内容。
4. 配置基于IP的虚拟主机
-
编辑nginx.conf配置文件,在listen部分写上详细的IP地址和端口。
server { listen 192.168.1.128:80; server_name localhost; charset utf-8; access_log logs/test1.com.access.log; location / { root html; index index.html; } } server { listen 192.168.1.150:80; server_name localhost; charset utf-8; access_log logs/test2.com.access.log; location / { root /var/www/html; index index.html; } }
-
检查Nginx配置文件是否存在语法问题,重启Nginx服务。
nginx -t systemctl restart nginx
-
在指定的两个index.html文件中,分别写入以下内容。
# /usr/local/nginx/html/index.html 这里是test1。 # /var/www/html/index.html 这里是test2。
-
配置虚拟网卡。
ifconfig ens33:1 192.168.1.150
-
在浏览器访问两个IP,查看内容。
5. 配置基于端口的虚拟主机
-
编辑nginx.conf配置文件,两个server模块的监听端口分别设置为8011、8022。
server { listen 8011; server_name localhost; charset utf-8; access_log logs/test1.com.access.log; location / { root html; index index.html; } } server { listen 8022; server_name localhost; charset utf-8; access_log logs/test2.com.access.log; location / { root /var/www/html; index index.html; } }
-
检查Nginx配置文件是否存在语法问题,重启Nginx服务。
nginx -t systemctl restart nginx
-
在指定的两个index.html文件中,分别写入以下内容。
# /usr/local/nginx/html/index.html 这里是test1。 # /var/www/html/index.html 这里是test2。
-
在浏览器访问Nginx所在主机的8011和8022端口,查看显示内容。