本文适合于已经对Linux操做系统具备基本操做经验,而且可以在Linux或Windows上经过一键搭建工具或者yum命令行进行环境搭建的读者,阅读本文需具备必定的专业知识,本文不建议初学者阅读。
本文所描述的是在标准的CentOS 7.2 64位操做系统下,安装Nginx 1.12.2 + PHP 7.1.11 + MySQL 5.7.20环境。采用源码编译安装的方式,虽然较直接使用yum命令安装较为复杂,可是源码安装能够自定义指定安装路径,能够自定义配置安装配套的库和插件,这样服务器运维人员将更清楚本身服务器的状况,从而,在往后的环境、插件的升级和更新操做中,将变得更加简便和容易。javascript
yum -y install gcc automake autoconf libtool make
yum install gcc gcc-c++ glibc
本文是在阿里云服务器上安装,因此在服务器根目录下建立alidata目录,而后在alidata目录里面分别建立server目录、webapps目录和package目录,其中server目录存放全部的服务器软件(本文中所涉及到的nginx、php、mysql等),webapps目录存放全部部署的代码及程序,package目录用来存放安装过程当中须要用到的编译后的库文件。
需以root权限,依次执行如下命令php
这里须要说明,上述的server目录,是指环境安装完成后,运行程序所在的目录,并不是nginx等程序的源码存放目录,为了方便,本文将下载到的这些运行环境程序的源码统一存放于/root目录下,读者可根据自身状况及喜爱,将运行环境程序源码存放于任意不是/alidata/server的目录下。css
官网:http://www.pcre.org/
依次执行如下命令html
cd /opt/
wget https://sourceforge.net/projects/pcre/files/pcre/8.41/pcre-8.41.tar.gz tar -zxvf pcre-8.41.tar.gz
官网:http://zlib.net/
依次执行如下命令java
cd /opt/
wget https://sourceforge.net/projects/libpng/files/zlib/1.2.11/zlib-1.2.11.tar.gz tar –zxvf zlib-1.2.11.tar.gz
官网:https://www.openssl.org/
依次执行如下命令node
cd /opt/
wget https://www.openssl.org/source/openssl-1.1.0b.tar.gz tar –zxvf openssl-1.1.0b.tar.gz
nginx的工做进程须要以某一个用户的权限进行运行,为了服务器安全,通常指定一个普通用户权限的帐号作为nginx的运行角色,根据我的习惯,这里使用www用户作为nginx工做进程的用户,后续安装的PHP也以www用户作为工做进程用户,依次执行如下命令以建立用户及用户组mysql
groupadd -r www useradd -r -g www www
官网:http://nginx.org/
依次执行如下命令linux
cd /opt/
wget http://nginx.org/download/nginx-1.12.2.tar.gz tar –zxvf nginx-1.12.2.tar.gz
以上命令完成下载和解压操做,接下来进行安装操做nginx
cd nginx-1.12.2/ ./configure --prefix=/opt/nginx --sbin-path=/opt/nginx/sbin/nginx --conf-path=/opt/nginx/nginx.conf --pid-path=/opt/nginx/nginx.pid --user=www --group=www --with-http_ssl_module --with-http_flv_module --with-http_mp4_module --with-http_stub_status_module --with-select_module --with-poll_module --error-log-path=/opt/nginx/logs/error.log --http-log-path=/opt/nginx/logs/access.log --with-pcre=/opt/pcre-8.41 --with-zlib=/opt/zlib-1.2.11 --with-openssl=/opt/openssl-1.1.0b make make install
其中,./configure是对安装进行配置;web
--prefix表示nginx要安装到哪一个路径下,这里指定刚才新建好的/alidata/server目录下的nginx-1.12.2; --sbin-path表示nginx的可执行文件存放路径 --conf-path表示nginx的主配置文件存放路径,nginx容许使用不一样的配置文件启动,经过命令行中的-c选项 --pid-path表示nginx.pid文件的存放路径,将存储的主进程的进程号。安装完成后,能够随时改变的文件名 , 在nginx.conf配置文件中使用 PID指令。默认状况下,文件名 为prefix/logs/nginx.pid --error-log-path表示nginx的主错误、警告、和诊断文件存放路径 --http-log-path表示nginx的主请求的HTTP服务器的日志文件的存放路径 --user表示nginx工做进程的用户 --group表示nginx工做进程的用户组 --with-select_module或--without-select_module表示启用或禁用构建一个模块来容许服务器使用select()方法 --with-poll_module或--without-poll_module表示启用或禁用构建一个模块来容许服务器使用poll()方法 --with-http_ssl_module表示使用https协议模块。默认状况下,该模块没有被构建。创建并运行此模块的OpenSSL库是必需的 --with-pcre表示pcre的源码路径,由于解压后的pcre是放在root目录下的,因此是/root/pcre-8.41; --with-zlib表示zlib的源码路径,这里由于解压后的zlib是放在root目录下的,因此是/root/zlib-1.2.11 --with-openssl表示openssl库的源码路径
配置成功后,依次执行make和make install命令,便可安装Nginx,安装成功后,能够看到在/opt目录下,多出了一个nginx里面便是nginx的实际运行程序。
3.六、设置nginx配置文件
本文配置的nginx支持多域名,每一个域名的配置文件单独放在/opt/nginx/conf/vhosts路径下,使用vim命令打开nginx.conf文件,对其内容进行修改
user www www; worker_processes auto; error_log /opt/nginx/logs/nginx_error.log crit; pid /opt/nginx/logs/nginx.pid; worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; multi_accept on; } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 64k; large_client_header_buffers 4 32k; client_max_body_size 500M; sendfile on; tcp_nopush on; keepalive_timeout 300; #proxy超时时间 proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; #缓存配置 proxy_cache_key '$host:$server_port$request_uri'; proxy_temp_file_write_size 512k; proxy_temp_path /opt/dev/shm/JieLiERP/proxy_temp_path; proxy_cache_path /opt/dev/shm/JieLiERP/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=5d max_size=1g; proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie; #缓存配置结束 gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE [1-6]\."; proxy_buffer_size 128k; proxy_buffers 32 128k; proxy_busy_buffers_size 128k; #limit_conn_zone $binary_remote_addr zone=perip:10m; ##If enable limit_conn_zone,add "limit_conn perip 10;" to server section. server_tokens off; access_log off; include vhost/*.conf; }
上述配置中,引用了/alidata/server/nginx/conf/vhosts/目录下全部后缀名是.conf的配置文件,如今进入该目录编写一个默认配置文件default.conf,其内容是
server {
listen 80;
server_name localhost;
index index.html;
root /alidata/webapps;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
#伪静态规则
include /alidata/server/nginx-1.12.2/conf/rewrite/default.conf; access_log /alidata/logs/nginx/access/default.log; error_log /alidata/logs/nginx/error/default.log; }
其中引入了一个/alidata/server/nginx-1.12.2/conf/rewrite/default.conf文件,这个文件是用来编写rewrite规则的配置文件,用来实现伪静态,其内容是
rewrite ^(.*)-htm-(.*)$ $1.php?$2 last; rewrite ^(.*)/simple/([a-z0-9\_]+\.html)$ $1/simple/index.php?$2 last; rewrite ^(.*)/data/(.*)\.(htm|php)$ 404.html last; rewrite ^(.*)/attachment/(.*)\.(htm|php)$ 404.html last; rewrite ^(.*)/html/(.*)\.(htm|php)$ 404.html last;
以本文为例,启动nginx须要执行如下命令
/opt/nginx/sbin/nginx
启动后,使用命令
ps aux | grep nginx
查看进程,若可以看到相关进程,则证实启动成功。查询进程时,能够看到进程是以www用户身份执行的
使用vim命令打开/etc/profile文件,在文件最末尾加上以下代码
export NGINX_HOME=/opt/nginx-1.12.2 export PATH=$PATH:$NGINX_HOME/sbin
保存修改后,使用source命令从新加载配置文件,命令以下
source /etc/profile
执行上述命令后,可以使用
echo $PATH
命令查看环境变量中是否已经加入了相关的路径
使用vim命令在/etc/init.d/目录下建立一个nginx文件,命令以下
vim /etc/init.d/nginx
文件内容以下
#!/bin/bash # chkconfig: - 85 15 PATH=/opt/nginx DESC="nginx daemon" NAME=nginx DAEMON=$PATH/sbin/$NAME CONFIGFILE=$PATH/$NAME.conf PIDFILE=$PATH/logs/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME set -e [ -x "$DAEMON" ] || exit 0 do_start() { $DAEMON -c $CONFIGFILE || echo -n "nginx already running" } do_stop() { $DAEMON -s stop || echo -n "nginx not running" } do_reload() { $DAEMON -s reload || echo -n "nginx can't reload" } case "$1" in start) echo -n "Starting $DESC: $NAME" do_start echo "." ;; stop) echo -n "Stopping $DESC: $NAME" do_stop echo "." ;; reload|graceful) echo -n "Reloading $DESC configuration..." do_reload echo "." ;; restart) echo -n "Restarting $DESC: $NAME" do_stop do_start echo "." ;; *) echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2 exit 3 ;; esac exit 0
其中,须要注意几个变量,分别是PATH、NAME、DAEMON、CONFIGFILE、PIDFILE、SCRIPTNAME,其中,PATH设置为nginx的安装路径,DAEMON设置为nginx启动脚本的路径,CONFIGFILE是nginx.conf文件的路径,PIDFILE是进程文件的路径,须要与nginx.conf文件中的配置一致,SCRIPTNAME则是要指向当前文件路径/etc/init.d/nginx
将上述文件保存后,必定要记得给其赋予可执行的权限,具体命令以下
chmod +x /etc/init.d/nginx
至此,咱们已将nginx加入了系统服务,因为本文描述的实在CentOS 7环境下安装,因此与CentOS 6不一样的是,再也不使用相似于
service nginx start
这样的命令来开启或者关闭服务,而是使用以下命令开启和关闭服务
/bin/systemctl start nginx /bin/systemctl stop nginx /bin/systemctl reload nginx
若此时没法执行以上命令,首先要确认以前打开的nginx进程已被杀死,其次能够尝试先执行
systemctl enable nginx
命令,而后再执行上述三个命令。
通过上面的操做,nginx已被添加为系统服务,因此能够将其设置为开机自启动,这样就能够避免每次服务器重启以后须要手动开启nginx的操做,具体命令以下
chkconfig --add nginx chkconfig nginx on
或者
systemctl enable nginx
==============================================================================================
依次执行如下命令
yum -y install libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel
官网:http://php.net/
依次执行如下命令
cd /root/
wget http://cn2.php.net/distributions/php-7.1.11.tar.gz tar –zxvf php-7.1.11.tar.gz
以上命令完成下载和解压操做,接下来进行安装操做
cd /root/php-7.1.11 ./configure --prefix=/alidata/server/php-7.1.11 --with-config-file-path=/alidata/server/php-7.1.11/etc --enable-fpm --with-mcrypt --enable-mbstring --enable-pdo --with-curl --disable-debug --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-mysqli --with-gd --with-jpeg-dir --with-freetype-dir --enable-calendar make make install
将官方提供的配置模板拷贝到配置参数中所指定的目录中
cp /root/php-7.1.11/php.ini-production /alidata/server/php-7.1.11/etc/php.ini
而后能够根据本身服务器的需求,对php.ini文件的内容进行修改
依次执行如下命令
cd /alidata/server/php-7.1.11/etc cp php-fpm.conf.default php-fpm.conf cd /alidata/server/php-7.1.11/etc/php-fpm.d cp www.conf.default www.conf
使用vim命令对php-fpm.conf的内容进行以下修改
pid= /alidata/server/php-7.1.11/var/run/php-fpm.pid
使用vim命令对www.conf的内容进行以下修改
user = www
group = www
listen = 127.0.0.1:9000 pm.max_children = 100 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35
其余配置可根据本身的状况进行相应修改
完成以上配置后,便可启动php-fpm,执行如下命令
/alidata/server/php-7.1.11/sbin/php-fpm
启动后,使用
ps aux | grep php-fpm
命令查看进程,若可以看到相关进程,则证实启动成功。查询进程时,能够看到进程是以www用户身份执行的
使用vim命令打开/etc/profile文件,在文件最末尾加上以下代码
export PHP_HOME=/alidata/server/php-7.1.11 export PATH=$PATH:$PHP_HOME/bin:$PHP_HOME/sbin
保存修改后,使用source命令从新加载配置文件,命令以下
source /etc/profile
执行上述命令后,可以使用
echo $PATH
命令查看环境变量中是否已经加入了相关的路径
使用vim命令在/etc/init.d/目录下建立一个php-fpm文件,命令以下
vim /etc/init.d/php-fpm
文件内容以下
#!/bin/bash # php-fpm startup script for the php-fpm # php-fpm version:7.1.11 # chkconfig: - 85 15 # description: php-fpm # processname: php-fpm # pidfile: /alidata/server/php-7.1.11/var/run/php-fpm.pid # config: /alidata/server/php-7.1.11/etc/php-fpm.conf php_command=/alidata/server/php-7.1.11/sbin/php-fom php_config=/alidata/server/php-7.1.11/etc/php-fpm.conf php_pid=/alidata/server/php-7.1.11/var/run/php-fpm.pid RETVAL=0 prog="php-fpm" #start function php_fpm_start() { /alidata/server/php-7.1.11/sbin/php-fpm } start(){ if [ -e $php_pid ] then echo "php-fpm already start..." exit 1 fi php_fpm_start } stop(){ if [ -e $php_pid ] then parent_pid=`cat $php_pid` all_pid=`ps -ef | grep php-fpm | awk '{if('$parent_pid' == $3){print $2}}'` for pid in $all_pid do kill $pid done kill $parent_pid fi exit 1 } restart(){ stop start } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart) stop start ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|status}" exit 1 esac exit $RETVAL
其中,php_command表示php-fpm可执行脚本的路径,php_config表示php-fpm的配置文件路径,php_pid表示php-fpm进程文件的路径
通过上面的操做,php-fpm已被添加为系统服务,因此能够将其设置为开机自启动,这样就能够避免每次服务器重启以后须要手动开启php-fpm的操做,具体命令以下
chkconfig --add php-fpm chkconfig php-fpm on
或者
systemctl enable php-fpm
官网:https://cmake.org/
依次执行如下命令
cd /root/
wget https://cmake.org/files/v3.10/cmake-3.10.0-rc5.tar.gz tar –zxvf cmake-3.10.0-rc5.tar.gz
以上命令完成下载和解压操做,接下来进行安装操做
cd cmake-3.10.0-rc5 ./configure --prefix=/alidata/package/cmake make make install export PATH=/package/cmake/bin:$PATH
官网:http://invisible-island.net/ncurses/
依次执行如下命令
cd /root/
wget http://ftp.gnu.org/gnu/ncurses/ncurses-6.0.tar.gz tar –zxvf ncurses-6.0.tar.gz
以上命令完成下载和解压操做,接下来进行安装操做
cd ncurses-6.0 ./configure --prefix=/alidata/package/ncurses make make install
执行如下命令
yum install libaio*
安装libaio和libaio-devel这两个库
为了保证操做系统的安全,这里为mysql工做进程建立专用的用户
groupadd mysql
useradd -r -g mysql mysql
5.五、下载并安装MySQL
官网:https://www.mysql.com
依次执行如下命令
cd /root/ wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz tar –zxvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.20-linux-glibc2.12-x86_64 /alidata/server/mysql-5.7.20/
这里使用的是mysql官方提供的解压缩版的安装方式,不须要进行make操做。将mysql文件夹移动到安装路径后,须要修改mysql安装文件夹的权限,执行如下命令
chown –R mysql.mysql /alidata/server/mysql-5.7.20/
后续若是在该目录及其子目录下建立了任何文件和文件夹,均须要再次执行该命令,以确保mysqld进程对该文件夹具备彻底的读写权限
mysql的配置文件是放在/etc/目录下的,名字是my.cnf,具体配置以下
[client]
port = 3306 socket = /alidata/server/mysql-5.7.20/tmp/mysql.sock [mysqld] basedir=/alidata/server/mysql-5.7.20 datadir=/alidata/server/mysql-5.7.20/data socket=/alidata/server/mysql-5.7.20/tmp/mysql.sock #skip-external-locking # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mariadb according to the # instructions in http://fedoraproject.org/wiki/Systemd log-error=/alidata/logs/mysql/error.log pid-file=/alidata/logs/mysql/mysql.pid [mysqld_safe] log-error=/alidata/logs/mariadb/error.log pid-file=/alidata/logs/mariadb/mariadb.pid # # include all files from the config directory # !includedir /etc/my.cnf.d
这里须要注意,配置文件最后一行引入了新的配置文件,下面列出my.cnf.d目录下名为mysql-clients.cnf的配置文件内容
#
# These groups are read by MariaDB command-line tools # Use it for options that affect only one utility # [mysql] [mysql_upgrade] [mysqladmin] [mysqlbinlog] [mysqlcheck] [mysqldump] [mysqlimport] [mysqlshow] [mysqlslap]
在my.cnf配置文件中,须要注意几个配置,其中basedir指的是mysql的安装目录,datadir指的是mysql数据文件的存储目录,其余几项配置项,若是你们感兴趣能够自行查看官方解释。还须要特别说明的一个问题是,全部在配置文件中出现的路径、文件均须要具备可读写的权限,前面为MySQL建立了用户及组,因此上述配置文件中涉及到的路径和文件,均须要将其全部者及组指定为mysql用户,这样MySQL服务才能正常启动。
完成以上配置后,须要将mysqld的启动脚本放入/etc/init.d/路径中,执行如下命令
cp –a /alidata/server/mysql-5.7.20/support-files/mysql.server /etc/init.d/mysqld
拷贝完成后,使用vim命令,修改/etc/init.d/mysqld中的basedir和datadir,确保其值与my.cnf文件中的内容相同
因本文采用的是MySQL 5.7.20版本,因此不能使用mysql_install_db命令,而是须要使用mysqld –initialize命令对数据库进行初始化,具体命令以下
/alidata/server/mysql-5.7.20/bin/mysqld –initialize --user=mysql --basedir=/alidata/server/mysql-5.7.20/ --datadir=/alidata/server/mysql-5.7.20/data/
若前面配置文件中的各配置项均正确,各路径、文件均存在并可读写,改命令将提示执行成功,并可以在/root/目录下生成一个.mysql_secret文件,使用cat命令可查看其内容,其是mysql中本地root用户的初始密码。这里须要特别说明一下,本文做者使用mysql自动生成初始密码没有登陆成功,而后经过安全启动脚本对mysql的root用户密码进行修改后,才可以正常登陆和使用,因此这一步目前没法获得确认,你们可根据本身的实际状况处理。
在mysql安装目录的bin目录下,使用如下命令启动mysql
./mysqld_safe --user=mysql &
启动后,使用初始化所得的root密码登陆mysql,查看是否能够正常操做,命令以下
./mysql –uroot –p
依次执行如下命令
cd /alidata/server/mysql-5.7.20/bin/ chkconfig --level 35 mysqld on
5.10. 启动MySQL服务
前文使用的是安全模式启动,如今,须要让MySQL服务正常启动,首先,经过命令
ps aux | grep mysql
查找到经过mysqld_safe命令启动的进程,使用kill命令将其所有杀掉,而后使用
/etc/init.d/mysqld start
命令,启动MySQL服务,接下来,就请使用root用户登陆,而后进行建立用户,建立数据库,赋权等操做,这部分属于MySQL的基本操做,本文再也不赘述。
与Apache服务器不一样的是,Nginx自己并不解释、运行PHP代码,Nginx只是将用户端发来的HTTP请求进行转发,真正解释运行PHP代码的是php-fpm进程,因此,这里只须要将Nginx收到的http请求转发给php-fpm便可。
根据本文前序步骤,已经完成了Nginx和PHP的安装和配置,接下来,只须要在Nginx的配置文件中加入转发至php-fpm的配置便可。
本文中对Nginx进行了多域名配置,每一个域名只须要在/alidata/server/nginx-1.12.2/conf/vhosts目录下有一个本身的配置文件便可,因此重点就在这个配置文件里,如今假定咱们须要查看当前服务器的php信息,由于本文没有涉及到域名解析及配置的相关信息,因此这里就以IP访问为例进行配置讲解,首先,须要在咱们的web代码根路径/alidata/webapps下建立一个info.php文件,执行如下命令
vim /alidata/webapps/info.php
文件内容是一段很是简单的php代码
保存文件后,对Nginx的配置文件进行修改,前文已经在/alidata/server/nginx-1.12.2/conf/vhosts目录下建立了default.conf配置文件,如今对这个文件的内容进行修改,修改后的内容以下
server {
listen 80;
server_name localhost;
index index.php index.htm index.html;
root /alidata/webapps;
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
# 配置页面静态化
include /alidata/server/nginx-1.12.2/conf/rewrite/default.conf; access_log /alidata/logs/nginx/access/default.log; error_log /alidata/logs/nginx/error/default.log; }
能够看到,与以前的配置文件相比,主要是index配置项后,多了关于php的配置内容,以及location相关配置中,多了对于php的内容,保存以上配置文件,使用
systemctl reload nginx
命令,从新加载配置文件后,经过浏览器访问http://服务器的IP/info.php,便可看到上文中php代码的运行效果,具体以下图所示 至此,即完成了Nginx和PHP的配置,这里须要说明,上述的配置只是最简单的配置,若项目不是运行在web根目录下的,那么配置文件也须要对应的进行修改,若项目是采用CodeIgniter或Laravel等其余框架技术开发的,那么也须要对配置文件进行相应修改,这部份内容你们可自行百度,有不少相关的博客。