构建Nginx服务器
使用源码包安装nginx软件包
[root@proxy ~]# yum -y install gcc pcre-devel openssl-devel #安装依赖包
[root@proxy ~]# useradd -s /sbin/nologin nginx
[root@proxy ~]# tar -xf nginx-1.17.6.tar.gz
[root@proxy ~]# cd nginx-1.17.6
[root@proxy nginx-1.17.6]# ./configure \
--prefix=/usr/local/nginx \ #指定安装路径
--user=nginx \ #指定用户
--group=nginx \ #指定组
--with-http_ssl_module #开启SSL加密功能
[root@proxy nginx-1.17.6]# make && make install #编译并安装
- make:是一个构建工具,它可以通过Makefile文件自动构建及编译软件。
- gcc:GNU 编译器套件,可以编译多种编程语言的程序。
- pcre-devel:PCRE是一个高效的、具有广泛应用的正则表达式库,pcre-devel是该库的开发文件,可用于构建使用 PCRE 库的应用程序。
- openssl-devel:OpenSSL 是开源的安全套接字库,openssl-devel 提供了该库的开发文件,可用于在开发中编写安全的网络应用程序。
- --with-http_ssl_module:提供SSL加密功能
- --用户:指定账户
- --组:指定组
nginx命令的用法
[root@proxy ~]# /usr/local/nginx/sbin/nginx #启动服务
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s stop #关闭服务
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload #重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx -V #查看软件信息
Netstat -anptu |格雷普·恩金克斯
-a显示所有端口的信息
-n以数字格式显示端口号
-t显示TCP连接的端口
-u显示UDP连接的端口
-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p显示监听端口的服务名称是什么(也就是程序名称)
ss比netstat快的主要原因是,netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多
用户认证
通过Nginx实现Web页面的认证,需要修改Nginx配置文件,在配置文件中添加auth语句实现用户认证。最后使用htpasswd命令创建用户及密码即可
vim /usr/local/nginx/conf/nginx.conf
.. ..
server {
listen 80;
server_name localhost;
auth_basic "Input Password:"; //认证提示符信息
auth_basic_user_file "/usr/local/nginx/pass"; //认证的密码文件
location / {
root html;
index index.html index.htm;
}
}
生成密码文件,创建用户及密码
[root@proxy ~]# yum -y install httpd-tools
[root@proxy ~]# htpasswd -c /usr/local/nginx/pass tom //创建密码文件
New password:
Re-type new password:
Adding password for user tom
[root@proxy ~]# htpasswd /usr/local/nginx/pass jerry //追加用户,不使用-c选项
New password:
Re-type new password:
Adding password for user jerry
[root@proxy ~]# cat /usr/local/nginx/pass
基于xx的虚拟主机
虚拟主机一般可用分为:基于域名、基于IP和基于端口的虚拟主机
基于域名的虚拟主机
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
server {
listen 80; //端口
server_name www.a.com; //域名
location / {
root html; //指定网站根路径
index index.html index.htm;
}
}
… …
server {
listen 80; //端口
server_name www.b.com; //域名
location / {
root www; //指定网站根路径
index index.html index.htm;
}
}
基于端口的虚拟主机
server {
listen 9999; //端口
server_name web1.example.com; //域名
......
}
server {
listen 8888; //端口
server_name web1.example.com; //域名
.......
}
基于IP的虚拟主机
server {
listen 192.168.0.1:80; //IP地址与端口
server_name web1.example.com; //域名
... ...
}
server {
listen 192.168.0.2:80; //IP地址与端口
server_name web1.example.com;
... ...
}
SSL虚拟主机(信任证书后可以访问)
源码安装Nginx时必须使用--with-http_ssl_module参数,启用加密模块,对于需要进行SSL加密处理的站点添加ssl相关指令(设置网站需要的私钥和证书)
openssl genrsa > cert.key
openssl req -new -x509 -key cert.key > cert.pem
第一个命令将使用genrsa选项生成一个 RSA 私钥证书,并将其输出到 cert.key 文件中。
第二个命令将使用req选项生成一个新的自签名证书请求,并使用刚刚生成的 RSA 密钥进行签名。该命令将生成一个 X.509 格式的证书,并将其输出到 cert.pem 文件中。
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
… …
server {
listen 443 ssl;
server_name www.c.com;
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;
}
}
- ssl_session_cache指令启用SSL会话缓存,用于存储SSL会话信息以提高SSL连接响应时间,它使用共享内存区域存储SSL会话缓存,命名为“SSL”,大小为1MB;
- ssl_session_timeout指令配置SSL会话缓存的过期时间,默认为5分钟,过期后SSL会话信息将被删除;
- ssl_ciphers指令定义了服务器支持的SSL加密套件,此处指定服务器支持高安全性的加密套件,不支持无效加密套件和MD5算法;
- ssl_prefer_server_ciphers指令表示服务器优先使用自己配置的加密套件,而非客户端提供的加密套件。
MariaDB、PHP环境
目前的网站一般都会有动态和静态数据,默认nginx仅可以处理静态数据,用户访问任何数据都是直接返回对应的文件,如果如果访问的是一个脚本的话,就会导致直接返回一个脚本给用户,而用户没有脚本解释器,也看不懂脚本源代码!
mariadb、mariadb-server、mariadb-devel
php(开源脚本语言)、php-fpm(FastCGI进程管理器)、php-mysql(PHP 与 MySQL 数据库交互的功能)
FastCGI的内存消耗问题,一个PHP-FPM解释器将消耗约25M的内存/etc/php-fpm.d/www.conf
修改Nginx配置文件并启动服务
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.php index.html index.htm;
#设置默认首页为index.php,当用户在浏览器地址栏中只写域名或IP,不说访问什么页面时,服务器会把默认首页index.php返回给用户
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000; #将请求转发给本机9000端口,PHP解释器
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf; #加载其他配置文件
}
地址重写(rewrite)
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
server {
listen 80;
server_name localhost;
rewrite /a.html /b.html;
location / {
root html;
index index.html index.htm;
}
}
访问a.html重定向到b.html(跳转地址栏redirect)
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
server {
listen 80;
server_name localhost;
rewrite /a.html /b.html redirect;
location / {
root html;
index index.html index.htm;
}
}
rewrite ^/ http://www.tmooc.cn/ 匹配到根路径("/")时,替换为http://www.tmooc.cn/
rewrite ^/(.*)$ http://www.tmooc.cn/$1; 该规则使用正则表达式,匹配所有请求,并在匹配到的URL前添加http://www.tmooc.cn/,然后将重写后的URL传递给下一个处理程序。与直接重定向不同,此规则不会更改浏览器中显示的URL,但会将请求发送到新的URL上
rewrite 旧地址 新地址 [选项];
last 不再读其他rewrite
break 不再读其他语句,结束请求
redirect 临时重定向
permanent 永久重定向
反向代理
反向代理:客户端->反向代理服务器->后端服务器->反向代理服务器->客户端(反向代理服务器充当一个正向代理:
客户端->正向代理服务器->目标服务器->正向代理服务器->客户端(正向代理服务器充当一个"代理者")中间层);
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
.. ..
#使用upstream定义后端服务器集群,集群名称任意(如webserver)
#使用server定义集群中的具体服务器和端口
upstream webserver {
server 192.168.99.100:80;
server 192.168.99.200:80;
}
.. ..
server {
listen 80;
server_name localhost;
location / {
#通过proxy_pass将用户的请求转发给webserver集群
proxy_pass http://webserver;
}
}
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
.. ..
upstream webserver {
server 192.168.99.100 weight=1 max_fails=1 fail_timeout=30;
server 192.168.99.200 weight=2 max_fails=2 fail_timeout=30;
server 192.168.2.101 down;
}
#weight设置服务器权重值,默认值为1
#max_fails设置最大失败次数,测试服务器几次才确认服务器失败
#fail_timeout设置失败超时时间,单位为秒
#down标记服务器已关机,不参与集群调度
.. ..
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://webserver;
}
}
自定义报错页面
在配置文件里面找到修改即可
apache调度算法
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
.. ..
upstream webserver {
#通过ip_hash设置调度规则为:相同客户端访问相同服务器
ip_hash;
server 192.168.99.100 weight=1 max_fails=2 fail_timeout=10;
server 192.168.99.200 weight=2 max_fails=2 fail_timeout=10;
}
.. ..
server {
listen 80;
server_name www.tarena.com;
location / {
proxy_pass http://webserver;
}
}
定义状态页面
Active connections:当前活动的连接数量。
Accepts:已经接受客户端的连接总数量。
Handled:已经处理客户端的连接总数量。
(一般与accepts一致,除非服务器限制了连接数量)。
Requests:客户端发送的请求数量。
Reading:当前服务器正在读取客户端请求头的数量。
Writing:当前服务器正在写响应信息的数量。
Waiting:当前多少客户端在等待服务器的响应。
[root@proxy ~]# curl http://192.168.88.5/status
Active connections: 1
server accepts handled requests
10 10 3
Reading: 0 Writing: 1 Waiting: 0
优化Nginx并发量
ab -n 2000 -c 2000 http://192.168.88.5/
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
worker_processes 2; //与CPU核心数量一致
events {
worker_connections 65535; //每个worker最大并发连接数
}
.. ..
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
优化Linux内核参数(最大文件数量)
[root@proxy ~]# ulimit -a //查看所有属性值
[root@proxy ~]# ulimit -Hn 100000 //设置硬限制(临时规则)
[root@proxy ~]# ulimit -Sn 100000 //设置软限制(临时规则)
[root@proxy ~]# vim /etc/security/limits.conf
.. ..
* soft nofile 100000
* hard nofile 100000
#该配置文件分4列,分别如下:
#用户或组 硬限制或软限制 需要限制的项目 限制的值
增加数据包头部缓存大小
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
client_header_buffer_size 1k; //默认请求包头信息的缓存
large_client_header_buffers 4 4k; //大请求包头部信息的缓存个数与容量
.. ..
}
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
定义对静态页面的缓存时间
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
expires 30d; //定义客户端缓存时间为30天
}
}
Session与cookie
Session:存储在服务器端,保存用户名、登陆状态等信息。
Cookies:由服务器下发给客户端,保存在客户端的一个文件里。
修改Nginx配置文件(修改默认首页与动静分离)
[root@web2 ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}
Tomcat部署
[root@web1 ~]# yum -y install java-1.8.0-openjdk //安装JDK
[root@web1 ~]# yum -y install java-1.8.0-openjdk-headless //安装JDK
[root@web1 ~]# java -version
headles-安装JDK的头文件,这是在编译和安装其他软件时需要的
启动tomcat服务
/usr/local/tomcat/bin/startup.sh
虚拟主机
[root@web1 ~]# vim /usr/local/tomcat/conf/server.xml
… …
<Host name="www.a.com" appBase="a" unpackWARS="true" autoDeploy="true">
</Host>
<Host name="www.b.com" appBase="b" unpackWARS="true" autoDeploy="true">
</Host>
使用Maven部署网站系统
安装maven工具,以及java环境
[root@web1 ~]# tar -xf apache-maven-3.6.3-bin.tar.gz
[root@web1 ~]# mv apache-maven-3.6.3 /usr/local/maven
[root@web1 ~]# yum -y install java-1.8.0-openjdk
[root@web1 ~]# yum -y install java-devel
[root@web1 ~]# /usr/local/maven/bin/mvn -v
修改镜像地址,在第158行下添加
[root@web1 ~]# vim /usr/local/maven/conf/settings.xml
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
配置数据库并打包项目
[root@web1 ~]# yum install -y mariadb-server
[root@web1 ~]# systemctl start mariadb
[root@web1 ~]# cd CMS/
[root@web1 CMS]# cp src/main/resources/shishuocms.properties .
[root@web1 CMS]# mysql -uroot < sql/install.sql
[root@web1 CMS]# mysqladmin password
打包项目
[root@web1 CMS]# /usr/local/maven/bin/mvn clean package
上线测试
[root@web1 CMS]#cp target/shishuocms-2.0.1.war /usr/local/tomcat/webapps/ROOT.war
[root@web1 CMS]#/usr/local/tomcat/bin/startup.sh
制作nginx的RPM包(rpmbuild)
安装rpm-build软件包,编写SPEC配置文件,创建新的RPM软件包
[root@web1 ~]# yum -y install rpm-build
[root@web1 ~]# rpmbuild -ba nginx.spec //会报错,没有文件或目录
[root@web1 ~]# ls /root/rpmbuild //自动生成的目录结构
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
将源码软件复制到SOURCES目录
cp nginx-1.17.6.tar.gz /root/rpmbuild/SOURCES/
创建并修改SPEC配置文件
[root@web1 ~]# vim /root/rpmbuild/SPECS/nginx.spec
Name:nginx #源码包软件名称
Version:1.17.6 #源码包软件的版本号
Release: 10 #制作的RPM包版本号
Summary: Nginx is a web server software. #RPM软件的概述
License:GPL #软件的协议
URL: www.test.com #网址
Source0:nginx-1.17.6.tar.gz #源码包文件的全称
#BuildRequires: #制作RPM时的依赖关系
#Requires: #安装RPM时的依赖关系
%description
nginx [engine x] is an HTTP and reverse proxy server. #软件的详细描述
%post
useradd nginx #非必需操作:安装后脚本(创建账户)
%prep
%setup -q #自动解压源码包,并cd进入目录
%build
./configure
make %{?_smp_mflags}
%install
make install DESTDIR=%{buildroot}
%files
%doc
/usr/local/nginx/* #对哪些文件与目录打包
%changelog
使用配置文件创建RPM包\安装依赖软件包
[root@web1 ~]# yum -y install gcc pcre-devel openssl-devel
[root@web1 ~]# rpmbuild -ba /root/rpmbuild/SPECS/nginx.spec
[root@web1 ~]# ls /root/rpmbuild/RPMS/x86_64/nginx-1.17.6-10.x86_64.rpm
[root@web1 ~]# yum install /root/rpmbuild/RPMS/x86_64/nginx-1.17.6-10.x86_64.rpm
[root@web1 ~]# rpm -qa |grep nginx
[root@web1 ~]# ls /usr/local/nginx/
编写systemd Unit文件
systemd的Unit文件哪些语句可以控制进程启动顺序
- After
- Before
cp /usr/lib/systemd/system/{crond.service,test.service}
vim /usr/lib/systemd/system/test.service
[Unit]
Description=my test script
After=time-sync.target
[Service]
ExecStart=/root/test.sh
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
[Install]
WantedBy=multi-user.target
使用systemd管理Nginx服务
[root@web1 ~]# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The Nginx HTTP Server #描述信息
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
#仅启动一个主进程的服务为simple,需要启动若干子进程的服务为forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT ${MAINPID}
[Install]
WantedBy=multi-user.target