来源:我的博客站 OceanicKang |《Linux CentOS 7 安装 LNMP 环境》
官方文档:https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/
下载并安装 MySQL 官方的 Yum Repository
> rpm -Uvh http://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
安装 MySQL
> yum -y install mysql-community-server
启动 MySQL
> service mysqld start
# 若提示 Redirecting to /bin/systemctl start mysqld.service,则使用下面这个
> systemctl start mysqld.service
查看 MySQL 运行状态
> service mysqld status
# or
> systemctl status mysqld.service
设置开机启动
> systemctl enable mysqld.service
查看初始密码
> grep 'temporary password' /var/log/mysqld.log
# 如下图,初始密码为5Eatk=Q7iCPe
进入数据库
> mysql -uroot -p
# 会弹出 Enter password 要求输入密码
此时必须修改初始密码才能操作数据库
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
【要求】密码至少包含一个大写字母、一个小写字母、一个数字和一个特殊字符,并且总密码长度至少为8个字符
MySQL 更新与不更新
> yum -y update mysql-server
# or
> yum -y update
# 若在执行 Yum 时,不想更新 MySQL,可以卸载 Repository
> rpm -e --nodeps mysql80-community-release-el7-1.noarch
可视化 MySQL 管理软件登录授权
> grant all on *.* to root@'%' identified by '数据库密码';
【注】若要对 Nginx 进行优化,请使用编译方式安装,而非 Yum 安装。此处只介绍 Yum 安装
下载并安装 Nginx 官方的 Yum Repository
> rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
安装 Nginx
> yum -y install nginx
启动 Nginx
> systemctl start nginx.service
开启 80 端口,并通过域名或IP访问站点
> firewall-cmd --zone=public --add-port=80/tcp --permanent # 开启 80 端口
> firewall-cmd --reload # 重启防火墙
设置开机启动
> systemctl enable nginx.service
Nginx 配置信息
说明 | 路径 |
---|---|
网站文件存放默认目录 | /usr/share/nginx/html |
网站默认站点配置 | /etc/nginx/conf.d/default.conf |
自定义Nginx站点配置文件存放目录 | /etc/nginx/conf.d/ |
Nginx全局配置 | /etc/nginx/nginx.conf |
Nginx启动 | nginx -c /etc/nginx/nginx.conf |
下载并安装 Yum Repository
> yum -y install epel-release
> rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
安装 PHP7.2
> yum -y install mod_php72w php72w-opcache php72w-cli php72w-fpm php72w-common php72w-devel php72w-mysql [...]
安装包 | 提供的扩展 |
---|---|
mod_php72w | php72w, mod_php, php72w-zts |
php72w-bcmath | |
php72w-cli | php-cgi, php-pcntl, php-readline |
php72w-common | php-api, php-bz2, php-calendar, php-ctype, php-curl, php-date, php-exif, php-fileinfo, php-filter, php-ftp, php-gettext, php-gmp, php-hash, php-iconv, php-json, php-libxml, php-openssl, php-pcre, php-pecl-Fileinfo, php-pecl-phar, php-pecl-zip, php-reflection, php-session, php-shmop, php-simplexml, php-sockets, php-spl, php-tokenizer, php-zend-abi, php-zip, php-zlib |
php72w-dba | |
php72w-devel | |
php72w-embedded | php-embedded-devel |
php72w-enchant | |
php72w-fpm | |
php72w-gd | |
php72w-imap | |
php72w-interbase | php_database, php-firebird |
php72w-intl | |
php72w-ldap | |
php72w-mbstring | |
php72w-mysql | php-mysqli, php_database |
php72w-mysqlnd | php-mysqli, php_database |
php72w-odbc | php-pdo_odbc, php_database |
php72w-opcache | php72w-pecl-zendopcache |
php72w-pdo | php72w-pdo_sqlite, php72w-sqlite3 |
php72w-pdo_dblib | php72w-mssql |
php72w-pear | |
php72w-pecl-apcu | |
php72w-pecl-imagick | |
php72w-pecl-mongodb | |
php72w-pgsql | php-pdo_pgsql, php_database |
php72w-phpdbg | |
php72w-process | php-posix, php-sysvmsg, php-sysvsem, php-sysvshm |
php72w-pspell | |
php72w-recode | |
php72w-snmp | |
php72w-soap | |
php72w-sodium | |
php72w-tidy | |
php72w-xml | php-dom, php-domxml, php-wddx, php-xsl |
php72w-xmlrpc |
查看一下 PHP 版本,以及扩展
> php -v
> php -m
配置 PHP-FPM
> vim /etc/php-fpm.d/www.conf
# ---------------------------
user = nginx
group = nginx
启动 PHP-FPM
> /usr/sbin/php-fpm
检查 PHP-FPM 服务
> ps -ef | grep php-fpm
> netstat -tlnp | grep 9000
修改 Nginx 配置
> cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.backup # 备份初始配置
> vim /etc/nginx/conf.d/default.conf
# ----------------------------------
# 去掉注释,修改 root 和 fastcgi_param
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Nginx 重载配置
> nginx -s reload
编写一个测试的 PHP 程序
> vim /usr/share/nginx/html/index.php
# -----------------------------------
<?php
phpinfo();
?>
浏览器输入地址查看
设置 Session 目录访问权限
> cd /var/lib/php
> chown -R nginx:nginx *
PHP-FPM 启动、停止、重启
> systemctl start php-fpm # 启动
> systemctl stop php-fpm # 停止
> systemctl restart php-fpm # 重启
PHP-FPM 配置文件路径:/etc/php-fpm.conf and /etc/php-fpm.d/*.conf
利用 TCMalloc 优化 Nginx 的性能
【注】这里的 Nginx 是以编译方式安装,而非 Yum 安装
libunwind下载地址:http://download.savannah.nongnu.org/releases/libunwind/
gperftools下载地址:https://gperftools.googlecode.com/files/
# 安装 libunwind
> cd /opt
> wget http://download.savannah.nongnu.org/releases/libunwind/libunwind-1.2.1.tar.gz
> tar -zxvf libunwind-1.2.1.tar.gz
> cd libunwind-1.2.1
> ./configure && make && make install
# 安装 google-perftools
> cd /opt
> wget https://gperftools.googlecode.com/files/gperftools-2.6.tar.gz
> tar -zxvf gperftools-2.0.tar.gz
> cd gperftools-2.0
> ./configure --enable-frame-pointers && make && make install
# 配置 gperftools
> echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
> /sbin/ldconfig
# 之后进入 Nginx 安装包目录
> ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --with-google_perftools_module
> make && make install
# 创建线程目录
> mkdir /tmp/tcmalloc
> chmod 777 /tmp/tcmalloc
# 修改 Nginx 配置文件
> vim /usr/local/nginx/conf/nginx.conf
# ------------------------------------
# pid logs/nginx.pid;
google_perftools_profiles /tmp/tcmalloc;
# 重启 Nginx
> service restart nginx
# 测试
> lsof -n | grep tcmalloc
> lsof -n | grep nginx
Nginx 内核优化
常见优化参数如下:
net.ipv4.tcp_max_tw_buckets = 6000 # 设定 timewait 数量,默认180000
net.ipv4.ip_local_port_range = 1024 65000 # 设定允许系统打开的端口范围
net.ipv4.tcp_tw_recycle = 1 # 设置启用 timewait 快速回收
net.ipv4.tcp_tw_reuse = 1 # 设置开启重用,允许将 timewait sockets 重新用于新的 TCP 连接
net.ipv4.tcp_syncookies = 1 # 设置开启 SYN Cookies,当出现 SYN 等待队列溢出时,启用 cookies 进行处理
net.core.somaxconn = 262144 # 用于调节系统同时发起 TCP 连接数,默认128。需要结合并发请求数来调节此值
net.core.netdev_max_backlog = 262144 # 当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目
net.ipv4.tcp_max_orphans = 262144 # 设定系统中最多有多少个 TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立连接将立即被复位并打印出警告信息。这个限制只是为了防止简单的 DOS 攻击。不能过分依靠这个限制,甚至减小这个值,更多的情况是增加这个值
net.ipv4.tcp_max_syn_backlog = 262144 # 记录那些尚未收到客户端确认信息的连接请求的最大值。对于有 128MB 内存的系统而言,此参数的默认值是 1024,对于小内存的系统则是 128
net.ipv4.tcp_synack_retries = 1 # 参数的值决定了内核放弃连接之前发送 SYN+ACK 包的数量
net.ipv4.tcp_syn_retries = 1 # 在内核放弃建立连接之前发送 SYN 包的数量
net.ipv4.tcp_fin_timeout = 1 # 套接字保持在 FIN-WAIT-2 状态的时间。默认值是 60 秒。正确设置这个值非常重要,有时候即使一个负载很小的 WEB 服务器,也会出现因为大量的死套接字而产生内存溢出的风险
net.ipv4.tcp_keepalive_time = 30 # 当 keepalive 启用的时候,TCP 发送 keepalive 消息的频度。默认值是 2(小时)
将上面的内核参数值加入 /etc/sysctl.conf
文件中,然后执行如下命令使之生效:
> /sbin/sysctl -p
配置文件优化
配置 | 参数 | 说明 |
---|---|---|
worker_processes | 8 | Nginx 进程数,建议按照 CPU 数目来指定, 一般为它的倍数(如 2 个四核 CPU 计为 8) |
worker_cpu_affinity | 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000 |
为每个进程分配 CPU, 上例中将 8 个进程分配到 8 个 CPU,也可以写多个, 或者将一个进程分配到多个 CPU |
worker_rlimit_nofile | 65535 | 当一个 Nginx 进程打开的最多文件描述符数目, 理论值应该是最多打开文件数(ulimit -n)与 Nginx 进程数相除, 但是 Nginx 分配请求并不是那么均匀, 所以最好与 ulimit -n 的值保持一致 |
use epoll | 使用 epoll 的 I/O 模型 | |
worker_connections | 65535 | 每个进程允许的最多连接数,理论上每台 Nginx 服务器的 最大连接数为 worker_processes * worker_connections |
keepalive_timeout | 60 | keepalive 超时时间 |
client_header_buffer_size | 4k | 客户端请求头的缓冲区大小, 可以根据系统分页大小来设置,一般一个请求头的大小不会超过4k |
open_file_cache | max=65535 inactive=60s |
将打开文件指定缓存,默认没有启用。 max指定缓存数量,建议和打开文件数一致, inactive 指经过多长时间没被请求后删除缓存 |
open_file_cache_valid | 80s | 指多长时间检查一次缓存的有效信息 |
open_file_cache_min_uses | 1 | open_file_cache 指令中的 inactive 参数时间内文件的最少使用次数, 如果超过这个数字,文件描述符一直是在缓存中打开的 |