目录 准备工作 安装wget 安装net-tools 安装vim 配置显示行号 关闭防火墙 安装Nginx 安装依赖 编译安装Nginx 配置环境变量 Systemd管理 安装MySQL 安装依赖 下载boost 编译安装MySQL 配置环境变量 修改配置文件 Systemd管理 登录MySQL 安装PHP 安装依赖 编译安装PHP 配置Systemd服务 关联Nginx和PHP 安装Redis 编译安装 配置环境变量 配置后台运行 配置Systemd服务 参考资料 作为一名PHP开发者,我们一定要懂得如何搭建PHP开发环境,目前主流的PHP开发环境组合是LAMP和LNMP,本文将介绍如何在CentOS7.*上搭建LNMP开发环境。 各项版本说明: CentOS7: 7.7 Nginx: 1.16.1 MySQL:5.7.28 PHP:7.2.25 安装所需所有的资源我都放在了/usr/local/src目录下 准备工作 安装wget wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的TCP/IP协议下载,并可以可以使用HTTP代理。 sudo yum -y install wget 安装net-tools 最小化安装CentOS7时如果无法使用ifconfig命令,则需要安装net-tools,如果是安装的CentOS6版本则无需安装 sudo yum -y install net-tools 安装vim sudo yum -y install vim 配置显示行号 vim ~/.vimrc # 编辑.vimrc配置文件 set nu # 输入set nu 后退出保存 关闭防火墙 systemctl stop firewalld.service #令关闭防火墙 systemctl disable firewalld.service #关闭防火墙开机自启动 通过浏览器输入IP测试是否成功 安装Nginx 安装依赖 (1) 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装gcc-c++。 yum -y install gcc gcc-c++ (2) PCRE是一个Perl库,中文"Perl兼容的正则表达式库"。安装Nginx是为了使Nginx支持具备URI重写功能的rewrite模块,如果不安装pcre库,则Nginx无法使用rewrite模块功能,Nginx的Rewrite模块功能几乎是企业应用必须。 yum -y install pcre pcre-devel (3) zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。 yum -y install zlib zlib-devel (4) OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。 nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要安装 OpenSSL 库 。 yum -y install openssl openssl-devel 说明: yum安装方式安装的pcre版本比较低,不过基本不影响使用,但是最好还是手动编译安装官网最新稳定版的openssl。 检查基础依赖包 上面的依赖安装完成后可以通过如下命令检查各个依赖安装是否成功 rpm -qa pcre pcre-devel rpm -qa zlib zlib-devel rpm -qa pcre pcre-devel 编译安装Nginx # 这里我们把安装包都放到了/usr/local/src目录下,便于统一管理 cd /usr/local/src #切换到软件包目录 wget http://nginx.org/download/nginx-1.16.1.tar.gz #下载nginx源码包 useradd nginx -s /sbin/nologin -M #创建nginx用户用于管理nginx程序 tar -zxvf nginx-1.16.1.tar.gz #解压nginx源码包 cd nginx-1.16.1 #预编译 ./configure \ --user=nginx \ --group=nginx \ --prefix=/usr/local/nginx-1.16.1 \ --with-http_v2_module \ --with-http_ssl_module \ --with-http_stub_status_module make && make install #编译 和 安装 cd /usr/local ln -s nginx-1.16.1 nginx #创建nginx的软链接 安装说明 --prefix=PATH #设置安装路劲 --user=USER #进程用户权限 --group=GROUP #进程用户组权限 --with-http_v2_module # HTTP2 --with-http_stub_status_module #激活状态信息 --with-http_ssl_module #激活ssl功能 配置环境变量 vim /etc/profile export PATH=/usr/local/nginx/sbin:$PATH source /etc/profile Systemd管理 新建并编辑/usr/lib/systemd/system/nginx.service 文件 vim /usr/lib/systemd/system/nginx.service 并添加如下内容(这里的配置是根据自己安装Nginx的路径来配置的,Nginx安装在了/usr/local目录下) [Unit] Description=The nginx HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop PrivateTmp=true [Install] WantedBy=multi-user.target 通过yum安装的nginx,默认的nginx.service配置如下,可以作为参考 # /usr/lib/systemd/system/nginx.service [Unit] Description=The nginx HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid # Nginx will fail to start if /run/nginx.pid already exists but has the wrong # SELinux context. This might happen when running `nginx -t` from the cmdline. # https://bugzilla.redhat.com/show_bug.cgi?id=1268621 ExecStartPre=/usr/bin/rm -f /run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=process PrivateTmp=true [Install] WantedBy=multi-user.target 重载daemon 执行下面的命令重新载入 systemd,扫描新的或有变动的单元即可 systemctl daemon-reload 设置开机自启 systemctl enable nginx.service # 设置开机自启 systemctl disable nginx.service # 取消开机自启服务 Nginx服务管理常用命令 systemctl status nginx.service # 查看Nginx状态 systemctl start nginx.service # 开启Nginx systemctl stop nginx.service # 关闭Nginx systemctl reload nginx.service # 重载配置 systemctl restart nginx.service # 重启Nginx(相当于stop&start) 服务启动检查 可以通过该命令查询80端口被谁占用 lsof -i :80 如果无法识别该命令,需要安装lsof sudo yum -y install lsof 安装MySQL 安装依赖 (1)cmake是新版MySQL的编译工具,必须安装 sudo yum -y install gcc gcc-c++ cmake ncurses-devel perl perl-devel autoconf bison bison-devel libtirpc libtirpc-devel 下载boost 如果安装的MySQL5.7及以上的版本,在编译安装之前需要安装boost,因为高版本mysql需要boots库的安装才可以正常运行。否则会报CMake Error at cmake/boost.cmake:81错误 切换到/usr/local/src目录,然后在这个目录下下载boost MySQL5.7.27要求boost的版本是1.59,更高版本的不适用MySQL5.7.28 wget http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz 百度网盘链接: boost_1_59_0.tar.gz 编译安装MySQL # 添加MySQL用户 useradd -s /sbin/nologin -M mysql # 切换到/usr/src目录 cd /usr/local/src # 下载MySQL wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28.tar.gz # 解压MySQL tar -zxvf mysql-5.7.28.tar.gz #解压boost,并移至mysql/boost tar -zxvf boost_1_59_0.tar.gz mv boost_1_59_0 mysql-5.7.28/boost # 进到MySQL目录 cd mysql-5.7.28 # 预编译 cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.28 \ -DWITH_BOOST=boost \ -DWITH_SYSTEMD=1 \ -DWITH_SSL=system \ -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \ -DMYSQL_DATADIR=/var/lib/mysql/data \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_INNODB_MEMCACHED=1 \ -DWITH_DEBUG=OFF \ -DWITH_ZLIB=bundled \ -DENABLED_LOCAL_INFILE=1 \ -DENABLED_PROFILING=ON \ -DMYSQL_MAINTAINER_MODE=OFF \ -DMYSQL_TCP_PORT=3306 # 编译&安装 make && make install # 创建软链接 cd /usr/local ln -s mysql-5.7.28 mysql 配置环境变量 # 添加到环境变量 vim /etc/profile export PATH=/usr/local/mysql/bin:$PATH source /etc/profile 修改配置文件 在/var/lib目录下创建一个mysql文件夹 mkdir -p /var/lib/{mysql,mysql/data} touch /var/lib/mysql/mysqld.pid chown mysql.mysql -R /var/lib/mysql/ 修改/etc/my.cnf文件 # 修改/etc/my.cnf文件,编辑配置文件如下 [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci datadir=/var/lib/mysql/data socket=/var/lib/mysql/mysql.sock [mysqld_safe] log-error=/var/log/mysql/mysqld.log pid-file=/var/lib/mysql/mysqld.pid [client] default-character-set=utf8mb4 创建mysqld.log 和 mysqld.pid文件,并修改文件权限 # 创建mysqld.log 和 mysqld.pid文件 mkdir /var/log/mysql touch /var/log/mysql/mysqld.log chown mysql.mysql -R /var/log/mysql/ 初始化数据库 # 初始化数据库, –initialize 表示默认生成一个安全的密码,–initialize-insecure 表示不生成密码 mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/mysql/data Systemd管理 创建一个/usr/lib/systemd/system/mysqld.service文件,然后编辑内容如下 vim /usr/lib/systemd/system/mysqld.service [Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql Type=forking PIDFile=/var/lib/mysql/mysqld.pid # Disable service start and stop timeout logic of systemd for mysqld service. TimeoutSec=0 # Execute pre and post scripts as root PermissionsStartOnly=true # Needed to create system tables ExecStartPre=/usr/local/mysql/bin/mysqld_pre_systemd # Start main service ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/var/lib/mysql/mysqld.pid $MYSQLD_OPTS # Use this to switch malloc implementation EnvironmentFile=/etc/my.cnf # Sets open_files_limit LimitNOFILE = 5000 Restart=on-failure RestartPreventExitStatus=1 PrivateTmp=true 重载daemon 执行下面的命令重新载入 systemd,扫描新的或有变动的单元即可 systemctl daemon-reload 启动MySQL systemctl start mysqld.service # 启动MySQL systemctl stop mysqld.service # 关闭MySQL systemctl status mysqld.service # 查看MySQL状态 开机自启 systemctl enable mysqld.service # 设置开机自启 systemctl disable mysqld.service # 取消开机自启 登录MySQL mysql -u root -p #第一次登陆不需要密码,回车即可 set password for root@localhost = password('root'); #修改密码 安装PHP 安装依赖 sudo yum -y install gcc gcc-c++ zip unzip libxml2 libxml2-devel curl-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel gd-devel bzip2 bzip2-devel libzip libzip-devel libwebp libwebp-devel 编译安装PHP cd /usr/local/src tar -zxvf php-7.2.25.tar.gz cd php-7.2.25 ./configure \ --prefix=/usr/local/php-7.2.25 \ --enable-fpm \ --with-fpm-user=nginx \ --with-fpm-group=nginx \ --enable-mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-mysqli=mysqlnd \ --with-mysql-sock=/var/lib/mysql/mysql.sock \ --with-gd \ --with-webp-dir \ --with-png-dir \ --with-gettext \ --with-jpeg-dir \ --with-freetype-dir \ --with-iconv-dir \ --with-zlib-dir \ --with-bz2 \ --with-openssl \ --with-curl \ --enable-mbstring \ --enable-static \ --enable-zip \ --enable-bcmath \ --enable-ftp \ --enable-pcntl \ --enable-soap \ --enable-calendar \ --enable-sockets \ --enable-exif \ --enable-xml make && make install 编译参数详解 ./configure \ --prefix=/usr/local/php-7.2.25 \ # 指定安装路径 --enable-fpm \ # 表示激活PHP-FPM方式服务,即FactCGI方式运行PHP服务。 --with-fpm-user=nginx \ # 指定PHP-FPM进程管理的用户为nginx,此处最好和Nginx服务用户统一。 --with-fpm-group=nginx \ # 指定PHP-FPM进程管理用户组为nginx,此处最好和Nginx服务用户组统一。 --enable-mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-mysqli=mysqlnd \ --with-mysql-sock=/var/lib/mysql/mysql.sock \ --with-gd \ # 打开gd库的支持 --with-webp-dir \ --with-png-dir \ --with-gettext \ # 实现了NLS (Native Language Support) API,他可以用来国际化您的PHP程序 --with-jpeg-dir \ --with-freetype-dir \ --with-iconv-dir \ # 包含了 iconv 字符集转换功能的接口。 --with-zlib-dir \ # 打开zlib库的支持,用于http压缩传输 --with-bz2 \ # 用于透明地读写 bzip2(.bz2)压缩文件。 --with-openssl \ # 打开openssl,加密传输时用到 --with-curl \ # 打开curl浏览工具的支持 --enable-mbstring \ # 多字节,字符串的支持 --enable-static \ # 生成静态链接库 --enable-zip \ # 打开对zip的支持 --enable-bcmath \ --enable-ftp \ # 通过文件传输协议 (FTP) 提供对文件服务器的客户端访问 --enable-pcntl \ # 多进程 --enable-soap \ --enable-calendar \ --enable-sockets \ # 打开 sockets 支持 --enable-exif \ # 可交换图像信息 --enable-xml 配置 cd /usr/local ln -s php-7.2.25 php cp /usr/local/src/php-7.2.25/php.ini-development /usr/local/php-7.2.25/lib/php.ini vim /usr/local/php/lib/php.ini date.timezone = PRC (大约在934行) expose_php = Off #避免PHP信息暴露在http头中(大约369行) display_errors = Off(生产环境设置为off,开发环境就设置为On,便于调试) 说明:设置了dispaly_errors为off后,需要在php-fpm.conf中开启错误日志记录路径error_log = log/php-fpm.log cd /usr/local/php cp etc/php-fpm.conf.default etc/php-fpm.conf cd /usr/local/php/etc/php-fpm.d/ cp www.conf.default www.conf cd /usr/local/php sbin/php-fpm ps -e | grep php-fpm 如果在编译PHP时指定了--with-mysql=mysqlnd和--with-pdo-mysql=mysqlnd的参数,那么在生产中可能会遇到socket连接问题,解决办法是在php.ini里加入命令: pdo_mysql.default_socket=/var/lib/mysql/mysql.sock 最好是在编译PHP的时候,指定mysql.socket的位置: --with-mysql-sock=/var/lib/mysql/mysql.sock 管理PHP-FPM vim /usr/local/php/etc/php-fpm.conf pid = run/php-fpm.pid error_log = log/php-fpm.log #24行这个在php.ini设置display_errors = Off时启用 设置完之后重启服务器 向进程发送信号,就可以完成进程管理 停止: kill -INT `cat /usr/local/php/var/run/php-fpm.pid` 平滑停止: kill -QUIT `cat /usr/local/php/var/run/php-fpm.pid` 重启:kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid` 重新打开日志:kill -USR1 `cat /usr/local/php/var/run/php-fpm.pid` 配置环境变量 vim /etc/profile export PATH=/usr/local/php/bin:$PATH source /etc/profile 配置Systemd服务 其实php-fpm.service文件php已经帮我们配置好了,只需要我们复制到指定位置,并启用就行了。 cp /usr/local/src/php-7.2.25/sapi/fpm/php-fpm.service /usr/lib/systemd/system/ 编辑/usr/lib/systemd/system/php-fpm.service文件并修改为如下内容: # It's not recommended to modify this file in-place, because it # will be overwritten during upgrades. If you want to customize, # the best way is to use the "systemctl edit" command. [Unit] Description=The PHP FastCGI Process Manager After=network.target [Service] Type=simple PIDFile=/usr/local/php/var/run/php-fpm.pid ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf ExecReload=/bin/kill -USR2 $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target 重载daemon 执行下面的命令重新载入 systemd,扫描新的或有变动的单元即可 systemctl daemon-reload 开机自启 systemctl enable php-fpm.service 启动php-fpm systemctl start php-fpm.service 关联Nginx和PHP nginx.conf配置 #user nobody; # 有一个工作的子进程,可以自行修改,但太大无益,因为要争夺CPU # 一般设置CPU数 * 核数 worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { #一般是配置Nginx进程与连接的特性 #若几个同时工作 multi_accept on; #打开同时接受多个新网络连接请求的功能。 use epoll; #使用epoll事件驱动,因为epoll的性能相比其他事件驱动要好很多 worker_connections 10240; #这是指一个子进程最大允许连接10240个连接 } http { # 这是配置http服务器的主要段 include mime.types; default_type application/octet-stream; #隐藏Nginx软件版本号 server_tokens off; #激活tcp_nodelay功能,提高I/O性能 tcp_nodelay on; # 设置读取客户端请求头数据的超时时间。此处的数值为15,其单位是秒,为经验参考值 client_header_timeout 15; # 设置读取客户端请求体的超时时间 client_body_timeout 15; # 指定响应客户端的超时时间 send_timeout 25; # 上传文件大小限制 client_max_body_size 8m; #压缩配置 gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain text/css text/xml application/javascript; gzip_vary on; #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; #include